豎式問題:
找出所有形如abc*de(三位數乘以兩位數)的算式,使得在完整的豎式中,所有數字都屬於一個特定的數字集合(也就是a b c d e 以及abc*e abc*d abc*de結果的每一位數字都屬於一個集合)。下面你輸入數字集合(相鄰數字之間沒有空格),輸出所有豎式。每個豎式前應有編號,之後應有一個空行。最後輸出解的總數,下面是輸入輸出樣例(爲了便於觀察,豎式中的空格改用小數點顯示,但所寫程序中應該輸出空格,而非小數點)
樣例輸入
2357
樣例輸出
<1>
..775
X..33
-----
.2325
2325.
-----
25575
The number of solutions = 1
問題分析:
嘗試所有的abc和de,判斷是否滿足條件。也就是判斷每一位數是否都在你輸入的那個數字集合中。
接下來有兩個問題:判斷和輸出。
我們先考慮輸出,因爲它比較簡單。每個豎式需要打印7行,但不一定要用7條printf語句,1條足矣。首先計算第一行乘積x=abc*e,然後第二行y=abc*d,最後是總乘積z=abc*de,然後一次性打印出來:
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);//%5d按照5位數打印,不足5位在前面補空格。
完整代碼如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int count =0;
char s[20], buf[99];
scanf("%s",s);
int abc, de, i;
for(abc=111; abc<=999; abc++){
for(de=11; de<=99; de++){
int x = abc*(de%10), y = abc*(de/10), z = abc*de;
sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z);//sprinf輸出到字符串
int ok = 1;
for(i=0; i < strlen(buf); i++){
if(strchr(s, buf[i])== NULL){//這裏是判斷是不是每一位數字都在你輸入的集合中,strchr的作用是在一個字符串中查找單個字符
ok = 0;
break;
}
}
if(ok){
printf("<%d>\n",++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);
}
}
}
printf("The number of solution = %d\n", count);
return 0;
}
樣例結果: