#include<iostream> #include<string> using namespace std; int main(){ char ID[20]; int w[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; int test=0,count=0,flag=1; char M[11]={'1','0','X','9','8','7','6','5','4','3','2'}; int N; cin>>N; for(int i=0;i<N;i++){ cin>>ID; for(int j=0;j<17;j++){ if(ID[j]!='0'&&ID[j]!='1'&&ID[j]!='2'&&ID[j]!='3'&&ID[j]!='4'&&ID[j]!='5'&&ID[j]!='6'&&ID[j]!='7'&&ID[j]!='8'&&ID[j]!='9'){ flag=0; cout<<ID<<endl; } else{ test+=(ID[j]-'0')*w[j]; } } test=test%11; if(flag==1){ if(ID[17]==M[test]){ count++; } else{ cout<<ID<<endl; } } } if(count==N){ cout<<"All passed"; } return 0; }2为什么test计算错误
时间: 2024-03-28 08:40:36 浏览: 18
在这段代码中,test 的初始值为 0,然后在循环中对其进行累加,最后再取模得到校验码。但是,如果输入的身份证号码中存在非数字字符,那么 flag 的值会被设为 0,而此时 test 的值并没有被重置为 0,因此会出现计算错误的情况。为了解决这个问题,应该在每次循环开始前将 test 的值重置为 0。代码如下:
```c++
for(int i=0;i<N;i++){
cin>>ID;
test = 0; // 重置 test 的值
flag = 1;
for(int j=0;j<17;j++){
if(ID[j]!='0'&&ID[j]!='1'&&ID[j]!='2'&&ID[j]!='3'&&ID[j]!='4'&&ID[j]!='5'&&ID[j]!='6'&&ID[j]!='7'&&ID[j]!='8'&&ID[j]!='9'){
flag=0;
cout<<ID<<endl;
}
else{
test+=(ID[j]-'0')*w[j];
}
}
test=test%11;
if(flag==1){
if(ID[17]==M[test]){
count++;
}
else{
cout<<ID<<endl;
}
}
}
```
相关问题
优化这段代码#include <iostream> #include <vector> #include <string> using namespace std; int main() { string s; s.reserve(100); char c; while (cin >> c) { s.push_back(c); } cout << "s===" << s << endl; return 0; }
这段代码的主要问题在于使用了大量的string操作,如果输入的数据量很大,会导致效率较低。可以使用字符数组来代替string,同时减少vector的使用,代码如下:
```c++
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[100];
int len = 0;
char c;
while (cin >> c) {
s[len++] = c;
}
s[len] = '\0';
cout << "s===" << s << endl;
return 0;
}
```
这里使用了字符数组s来存储输入的字符,同时使用一个变量len来记录当前字符数组中已经存储的字符数。当输入一个字符时,将其存入字符数组s中,并将len加1。最后,将字符数组s的最后一个字符设置为'\0',以便输出时正确显示字符串。这样可以避免使用string的大量操作,从而提高了效率。
统一文件名只用#include<iostream> #include<string.h>
这两个头文件的作用不同,<iostream> 是用于输入输出流的库,而<string.h> 是用于字符串处理的库。如果你的程序中需要使用字符串相关函数,如strcpy、strlen等,就需要用到<string.h>头文件。如果要使用cout和cin等输入输出流对象则需要使用<iostream>头文件。如果你两个都需要用到,那么你就需要同时包含这两个头文件。例如:
```cpp
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char str1[10] = "hello";
char str2[10] = "world";
strcat(str1, str2); // 使用<string.h>中的字符串拼接函数strcat
cout << str1 << endl; // 使用<iostream>中的输出流对象cout
return 0;
}
```