第 7 章 q11:
机票被分配了冗长的识别号码,例如 47715497443。为了有效,该号码的最后一位数字必须与其他数字(作为一组)除以 7 时的余数相匹配。编写一个程序来测试机票是否有效。
我的代码是:
main(){
char c;
int remainder = 0;
printf("Enter a ticket number: ");
while((c = getchar()) != '\n'){
c -= '0';
remainder = (remainder * 10 + c) % 7;
}
return 0;
}
但是,我无法弄清楚如何挑出航空公司号码的最后一位数字,以便不将其包含在余数计算中,并使用它来验证机票。
如有任何帮助,我们将不胜感激。
您只需缓冲
'\n'
之前输入的最后一位数字即可。
使用它来测试输入的每个字符的有效性可能是明智的:
isdigit( (unsigned char)ch )
或 strchr( "0123456789", ch ) != NULL
这使用循环计数器来确保至少输入两位数字。
#include <stdio.h>
int main( void ) {
for(;;) { // infinite loop for testing
char pending = '0'; // previous digit entered (starts as 0)
int remainder = 0;
printf( "Enter a ticket number: " );
int cnt, cin;
for( cnt = 0; ( cin = getchar() ) != '\n' && cin != EOF; cnt++ ) {
remainder = ( remainder * 10 + (pending - '0') ) % 7;
pending = (char)cin;
}
if( cin != EOF )
printf( "%s\n", (cnt >= 2 && remainder == pending - '0') ? "Valid" : "Invalid" );
}
/* NOTREACHED */
return 0;
}
首先,您应该将您的票号存储为一个很长的整数,因为它很长!然后你应该将最后一位数字存储在一个变量中,并将该数字除以 10。最后你可以检查余数是否等于最后一位数字。
#include <stdio.h>
int main() {
long long int ticketNumber;
int lastDigit;
int remainder;
scanf("%lld",&ticketNumber);
lastDigit = ticketNumber %10;
ticketNumber/=10;
if(ticketNumber % 7 == lastDigit){
printf("Ticket is valid!");
}else{
printf("Ticket is not valid!");
}
return 0;
}
这就是我想出来的。我不认为这是最好的解决方案,但它确实有效。
int main(void) {
char c;
int remainder = 0;
int i = 0;
char str[20] = "";
printf("Enter a ticket number: ");
while ((c = getchar()) != '\n')
{
str[i] = c;
i++;
}
for (int x = 0;x<i-1;x++)
{
remainder = (remainder * 10 + (str[x]-'0')) % 7;
}
if (remainder == (str[i-1]-'0'))
printf("Valid");
else
printf("Invalid");
return 0;
我最近做了这个问题,由于其他答案使用了书中尚未介绍的功能,所以我决定将我的解决方案放在这里。
int main(){
int remainder = 0, flag = 0;
char ch;
printf("Enter ticket number: ");
while ((ch = getchar()) != '\n') {
ch -= '0';
if (remainder == ch)
flag = 1;
else
flag = 0;
remainder = (remainder * 10 + ch) % 7;
}
if (flag)
printf("VALID\n");
else
printf("INVALID\n");
return 0;
}