例题3-4 竖式问题

竖式问题
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式详见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序中应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
<1>
..775
X..33
-----
.2325
2325.
-----
25575


The number of solutions = 1


#include <stdio.h>
#include <string.h>
int main()
{
   char s[6],s1[30];
   int i,j,sub,sub1,sub2,count=1,k;
   scanf("%s",s);
   for(i=100;i<1000;i++)
   {
   	 for(j=10;j<100;j++)
   	 {
	   int flag=0;
	   sub=i*j;
	   sub1=i*(j%10);
	   sub2=i*(j/10);
	   sprintf(s1,"%d%d%d%d%d",i,j,sub,sub1,sub2);//sprintf将数据写入数组buf 
	   for(int k=0;k<strlen(s1);k++)
	   {
	   	  if(strchr(s,s1[k])==NULL)
	   	  {
	   	  	flag=1;
	   	  	break;
		  }
	   }
	   if(flag==0)
	   {
	   	printf("<%d>\n",count);
	   	printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",i,j,sub1,sub2,sub);
	   	count++;
	   }
	 }
   }
   printf("The number of solutions = %d",count-1);
} 
关于string.h中的几个函数
1、strlen(数组名):计算数组的长度
2、strcmp(数组名1,数组名2):比较两个数组,如果数组2从第一个开始与数组2相同返回1,否则返回-1 
3、strcpy(数组名1,数组名2):复制数组2到数组1
4、strcat(数组名1,数组名2):将数组1和数组2连接成1个数组。
5、strchr(数组名1,数组元素):在数组1判查找数组元素,如果没有结果==NULL
6、sprintf(数组名1,"格式控制字符列表",数组名列表):将数组名列表中的数组一格式控制字符中的格式按顺序存入数组1中 

7、fprintf、fscanf分别从文件写和读

// fprintf、fscanf的标准写法测试 
#include <stdio.h>
#include <string.h>
int main()
{
	FILE *fin,*fout;
	fin=fopen("data.txt","rb");
	fout=fopen("test.out","wb");
	char s[30],s1[20];
	fscanf(fin,"%s",s);
	fscanf(fin,"%s",s1);
	fprintf(fout,"%s%s",s,s1);
	fclose(fout);
} 

### 高精度整数乘法的实现 以下是基于 C++ 的高精度整数乘法的一个具体实现示例。该代码利用了 `std::vector<int>` 来存储每一位数字,并按照乘法规则逐步计算结果。 #### 示例代码 ```cpp #include <iostream> #include <vector> #include <string> #include <algorithm> // 大整数相乘函数 std::vector<int> multiply(const std::vector<int>& a, const std::vector<int>& b) { int n = a.size(), m = b.size(); std::vector<int> result(n + m, 0); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { result[i + j] += a[i] * b[j]; result[i + j + 1] += result[i + j] / 10; result[i + j] %= 10; } } // 去除前导零 while (result.size() > 1 && result.back() == 0) { result.pop_back(); } return result; } // 将字符串转换为向量形的大整数 std::vector<int> stringToVector(const std::string& s) { std::vector<int> vec(s.size()); for (size_t i = 0; i < s.size(); ++i) { vec[s.size() - 1 - i] = s[i] - &#39;0&#39;; } return vec; } // 输出大整数的结果 void printResult(const std::vector<int>& v) { for (auto it = v.rbegin(); it != v.rend(); ++it) { std::cout << *it; } std::cout << "\n"; } int main() { std::string num1, num2; // 输入两个大整数 std::cin >> num1 >> num2; // 转换为向量形 std::vector<int> a = stringToVector(num1); std::vector<int> b = stringToVector(num2); // 计算乘积 std::vector<int> product = multiply(a, b); // 打印结果 printResult(product); return 0; } ``` 此代码实现了高精度整数乘法的核心逻辑,即通过模拟手的方逐位计算两数之积并处理进位[^1]。最终结果以逆序方存放在 `std::vector` 中,因此需要反转打印顺序以便得到正确的数值表示[^3]。 --- ### 关键点解析 1. **输入与初始化** 使用 `std::string` 接收任意长度的整数作为输入,并将其转化为低位优先的 `std::vector<int>` 表达形。这样可以方便后续按位操作。 2. **核心算法** 对于每一对位 `(a[i], b[j])`,先计算其乘积并将结果累加到对应的位置上;随后处理可能产生的进位情况。这一过程重复执行直至遍历完所有的组合。 3. **去前导零** 结果中的高位可能存在多余零值(例如当其中一个因数为零时)。为此,在返回之前需移除这些无意义的部分。 4. **输出格化** 最终结果应从最高有效位至最低有效位依次展示出来,故采用反向迭代器访问容器内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值