不知道哪里出錯了

#include<stdio.h>
void exam(long long ,int )
{
for(i=0;i<18;i++)
{
arr[i++]=ID%10;
ID=ID/10;
}
for(i=0;i<17;i++)
sum+=arr[i]*a[i];
sum%=11;
temp=b[sum]-'0';
if(temp!=arr[17])
flag=0;
}
int main()
{
long long ID;
int n,i,flag=1,arr[18];
scanf("%d",&n);
int sum=0,a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char b[]={'1','0','x','9','8','7','6','5','4','3','2'};
for(i=1;i<=n;i++)
{
scanf("%lld",&ID);
exam(long long ID,int i);
}
if(flag)
printf("All passed");
return 0;
}
uj5u.com熱心網友回復:
你把exam都代碼再放回main里面去吧然后 下面這兩個i++只可以保留一個
for(i=0;i<18;i++)
{
arr[i++]=ID%10;
ID=ID/10;
}
uj5u.com熱心網友回復:
而且,這個身份證號碼,如果尾巴是X,你這個scanf怎么也讀不進來x字符啊用字串作為輸入型別,讀入進來再轉換
uj5u.com熱心網友回復:
個人覺得你的思路是有些問題的,最后一個可能是X,longlong是不能存的#include<stdio.h>
#include<string.h>
int dis[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char m[]={'1','0','X','9','8','7','6','5','4','3','2'};
char mp[100][19];
int main(){
int n,num=0,i,j,k,ans=0;
char id[19];
scanf("%d",&n);
for(i=0;i<n;i++){
int sum=0;
scanf("%s",id);
for(j=0;j<17;j++){
sum+=(id[j]-'0')*dis[j];
}
sum%=11;
if(m[sum]==id[17]){
num++;
}
else{
strcpy(mp[ans++],id);
}
}
if(num==n){
printf("All passed\n");
}
else{
for(i=0;i<ans;i++){
puts(mp[i]);
}
}
return 0;
}
uj5u.com熱心網友回復:
可以簡單一些:
#include <stdio.h>
int main()
{
const char v[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
const char *m = "10X98765432";
char s[19];
int n, i, c, x, p = 0;
scanf("%d", &n);
while (n--)
{
scanf("%s", s);
for (i = c = 0; x = s[i] - 48, i < 17; i++)
x >= 0 && x < 10 ? c += x * v[i] : i = 19;
i == 19 || s[17] != m[c % 11] ? p = puts(s) : 0;
}
if (!p) puts("All passed");
return 0;
}
uj5u.com熱心網友回復:
樓主當做整數運算還有一個問題for(i=0;i<18;i++)
{
arr[i]=ID%10;
ID=ID/10;
}
這里得到的數是從低位向高位進行的, arr[0]就是身份證的第18位, arr[17]才是第一位
而用來和他做乘法的那個陣列順序和他恰好是相反的,是從高位到低位的順序
所以后面的
for(i=0;i<17;i++)
sum+=arr[i]*a[i];
這樣寫也是錯誤的。
用lld整數可以解決,但是方法上有不同
#include <stdio.h>
#include<stdio.h>
// id是17位數, ch是最有一位校驗碼字符
// 如果合法回傳0, 錯誤號碼回傳1
int exam(long long id, char ch )
{
int sum=0;
int arr[18];
int a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char b[]={'1','0','x','9','8','7','6','5','4','3','2'};
int i;
long long ID = id;
for(i=0;i<17;i++)
{
arr[i] = ID%10;
ID = ID/10;
}
for(i=0;i<17;i++)
sum += arr[16-i]*a[i];
sum%=11;
char temp=b[sum];
if( temp != ch) {
printf("%lld%c : %c\n", id, ch, temp);
return 1;
} else
return 0;
}
int main()
{
long long ID;
int n,i,flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
char ch;
//指定整數的位數,最后一個當做字符輸入
while ( 2!=scanf("%17lld%c", &ID, &ch)) {
fflush(stdin);
printf("輸入錯誤\n\
身份證號碼必須是18位,只有最后一位可以是字母而且只能是x!\n\
請重新輸入:\n");
}
flag += exam(ID, ch);
}
if(0==flag)
printf("All passed");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123364.html
標籤:C語言
上一篇:能不能幫我看一下codeblocks里的debug為什么不能執行呢?
下一篇:【C語言求助】
