C语言《竖式问题》

问题描述:
找出所有形如“abc*de”(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
在这里插入图片描述
题目分析:
因为题目需要打印出每个竖式,类似于平时我们手动算乘法的运算形式(X表示的是乘号),样例输出中的“-----”上方不做要求,即要求的是“-----”下方的两行数。假设第一行每个数字表示一个元素,它用集合A表示,同理第二行用集合B表示,而最初输入的所有数字也将它用一个集合S表示,所以要求集合A和B 都包含于集合S,则此题目的要求就成立了。剩下的则是一些格式问题。
代码:

#include<stdio.h>
#include<string.h>
int main()
{
	int count = 0;
	char s[20], buf[99];
	scanf("%s", s);
	int abc,de,i; 
	for(abc=100;abc<=999;abc++)
		for (de = 10; de <= 99; de++)
		{
			int x = abc * (de % 10);//得到“abc*e” ,即“-----”下方第一行的值
			int y = abc * (de / 10);//得到“abc*d” ,即“-----”下方第二行的值
			int z = abc * de;//得到最终的结果即abc*de 
			sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z);//将abc,de,x,y,z的结果输出到字符数组buf中 
			int ok = 1;
			for (i = 0; i < strlen(buf); i++)//遍历整个数组buf,看是否满足条件 
				if (strchr(s, buf[i]) == NULL)//在buf字符串中查找是否出现过s数组中的数 
					ok = 0;
			if (ok) //如果OK为真 
			{
				printf("<%d>\n", ++count);
				printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);//按照5位数打印 ,不足5位前面打空格 
			}
			
		}printf("The number of sulotions= %d\n", count);
	//system("pause");
	return 0;
}
  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
乘法的实现可以通过以下步骤: 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 ; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值