C语言 · 猜算式 · 乘法竖式

题目:猜算式

你一定还记得小学学习过的乘法计算过程,比如:

   273

x   15

------  

1365  

273

------  

4095  

请你观察如下的乘法算式

     ***

x   ***

--------    

     ***   

   ***  

***

--------  

*****  

星号代表某位数字,注意这些星号中,0~9中的每个数字都恰好用了2次。 (如因字体而产生对齐问题,请参看图p1.jpg)

条件:每个数字要出现两次、公式要成立、结果是五位数。

请写出这个式子最终计算的结果,就是那个5位数是多少?

 1 #include<stdio.h>
 2 #include<string.h>
 3 int jinwei(int i,int *f){
 4     while(i>0){
 5         if(f[i%10]==2){
 6             return 0;
 7         }
 8         f[i%10]++;
 9         i/=10;
10     }
11     return 1;
12 }
13 bool check(int i,int j,int a,int b,int c,int d){
14     int x[20]={i/100,(i/10)%10,i%10,j/100,(j/10)%10,j%10,a/100,(a/10)%10,a%10,b/100,(b/10)%10,b%10,c/100,(c/10)%10,c%10,d/10000,(d/1000)%10,(d/100)%10,(d/10)%10,d%10};
15     int y[20]={0};
16     for(int h=0;h<20;h++){
17         y[x[h]]++;
18     }
19     for(int h=0;h<20;h++){
20         if(y[h]!=2){
21             return false;
22         }else{
23             return true;
24         }
25     }
26 }
27 int main(){
28     int i,j;
29     for(i=100;i<=999;i++){
30         for(j=100;j<=999;j++){
31             int f[10]={0};//数组初始化 
32             int a = i*(j%10);//乘个位得 
33             int b = i*((j/10)%10);//乘十位得
34             int c = i*(j/100);//乘百位得
35             
36             if(a>=1000||b>=1000||c>=1000||i*j>=100000||a<100||b<100)
37                 continue;
38             
39             if(!check(i,j,a,b,c,i*j))
40                 continue;
41 
42             if(i<j && jinwei(i,f)&&jinwei(j,f)&&jinwei(i*j,f)&&jinwei(a,f)&&jinwei(b,f))
43                 printf("%d %d %d %d %d %d\n",i,j,a,b,c,i*j);
44         }
45     }
46     return 0;
47 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
竖式乘法实现可以通过以下步骤: 1. 将两个乘数按位拆分成个位、十位、百位等,分别存储在数组中。 2. 从第一个乘数的个位开始,依次与第二个乘数的每一位相乘,将结果存储在一个临时数组中。 3. 将临时数组中的每一位与结果数组中对应的位置相加,得到最终结果。 4. 最后将结果数组中的每一位转换成字符,拼接起来即可得到竖式乘法的结果。 以下是一个简单的示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 void vertical_multiply(char *num1, char *num2, char *result) { int len1 = strlen(num1), len2 = strlen(num2); int temp[MAX_LEN] = {}, res[MAX_LEN] = {}; // 从个位开始相乘 for (int i = len1 - 1; i >= ; i--) { for (int j = len2 - 1; j >= ; j--) { temp[i + j + 1] += (num1[i] - '') * (num2[j] - ''); } } // 处理进位 for (int i = len1 + len2 - 1; i > ; i--) { if (temp[i] >= 10) { temp[i - 1] += temp[i] / 10; temp[i] %= 10; } } // 将结果存储在数组中 for (int i = ; i < len1 + len2; i++) { res[i] = temp[i]; } // 将结果转换成字符 int i = ; while (i < len1 + len2 && res[i] == ) { i++; } if (i == len1 + len2) { result[] = ''; result[1] = '\'; } else { for (; i < len1 + len2; i++) { result[i - len1 - len2 + MAX_LEN] = res[i] + ''; } result[i - len1 - len2 + MAX_LEN] = '\'; } } int main() { char num1[MAX_LEN], num2[MAX_LEN], result[MAX_LEN * 2]; printf("请输入两个数:\n"); scanf("%s%s", num1, num2); vertical_multiply(num1, num2, result); printf("竖式乘法结果为:%s\n", result); return ; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值