题目描述:
嘿嘿,这个关于 7 的题目这次算是第三次了。这个 7 可谓是最厉害的,呵呵。 首先,如果这个数要在 1 - 1 000 000之间, 并且能够被 7 整除或者用 10 进制表示的时候包含数字 7, 那么这个数就叫做魔女の数。
输入:
有多个测试点,每个测试点一行,只有两个整数 a 和 b, 你需要计数出 a 和 b 之间(包含 a 和 b)一共有多少个 魔女の数。不过如果 a 与 b 其中有一个不在魔女の数 的范围内的话,应该输出 Overflow。
输出:
对每个测试点输出对应的魔女の数的数目, 一个结果一行,按样例格式输出。
样例输入:
1 10
7 17
0 9
样例输出:
有 1 个魔女の数
有 3 个魔女の数
题目要点:
(1)注意各种各样的输入格式(空格,回车,负号,0),才能提取出head以及tail;
(2)求出[a,b]之间的所有跟7有关(一是模7为0,而是数字本身包含7)的数字个数。
参考代码:
1 #include<iostream> 2 using namespace std; 3 4 char input; 5 6 void function(char first, int *head, int *tail) 7 { 8 if(first == '-')//判断开头没有没有负号,有的话直接输出overflow 9 { 10 *head = 0; 11 return ; 12 } 13 14 if((first == ' ' ) || (first == ' ') || first == '0')//判断字符开头是不是无关字符 15 return ; 16 17 input = first; 18 19 *head = 0; 20 while((input != ' ') && (input != ' '))//找出head 21 { 22 *head = (*head) * 10 + input - '0'; 23 if(*head > 1000000)//显然head > 1000000直接返回 24 { 25 while((input = getchar()) && input != ' ')//找到整个输入串的末尾 26 ; 27 return ; 28 } 29 30 input = getchar(); 31 } 32 33 while(input==' ') //吞掉head与tail之间的空格 34 input=getchar(); 35 36 int check = 0;//判断tail的第一个元素是不是0 37 while(input!=' ') //找出tail 38 { 39 if(input=='-') 40 return; 41 else if(input=='0' && check==0) 42 ; 43 else if(input==' ') 44 { 45 while((input=getchar()) && input!=' ') 46 ; 47 return; 48 } 49 else 50 { 51 *tail=(*tail)*10+input-'0'; 52 check=1; 53 if(*tail>1000000) 54 { 55 while((input=getchar()) && input!=' ') 56 ; 57 return; 58 } 59 } 60 input=getchar(); 61 } 62 return; 63 } 64 65 void judge(int head, int tail) //没 overflow 的情况下判断 head tail 之间的魔女数 66 { 67 int temp=0, copy; 68 for(; head <= tail ; head ++) 69 { 70 if(head % 7 == 0) //模7为0,则跳出 71 temp ++; 72 else 73 { 74 copy = head; 75 while(copy > 0) 76 { 77 if((copy - (copy / 10) * 10) == 7)//包含7就++,然后跳出 78 { 79 temp++; 80 break; 81 } 82 else 83 copy /= 10; 84 } 85 } 86 } 87 printf("有%d 个魔女の数 ", temp); 88 } 89 90 int main() 91 { 92 char first; 93 int head, tail; 94 95 while((first = getchar()) && first != EOF) 96 { 97 head = -1; 98 tail = 0; 99 100 function(first, &head, &tail);//找出head以及tail 101 102 if(head == -1) 103 continue; 104 else if((head > 0 && head <= 1000000) && (tail > 0 && tail <= 1000000)) 105 { 106 if(head <= tail) 107 judge(head, tail); 108 else 109 judge(tail, head); 110 } 111 else 112 { 113 printf("Overflow "); 114 while(input != ' ') 115 input = getchar(); 116 } 117 } 118 119 return 0; 120 }