C语言——<计算>_较大两个数相乘
例题:9876543210*1234567890 的乘积
分析:正常的数据结构已经无法满足这么大的数相乘的结果。只能使用数组来进行操作。
1、两个数都用字符数组来接收。
2、接收后,因为每一位要乘以另一个数的每一位,
数组下标0的位置是数字的最高位,这样每次相乘后都会发生最高为变化。而下标0的位置不易变化。
需要将最低位的值转移到下标为0这个位置,将最高位的数组下标改成最大下标。
所以,需要将原来的两个数,进行取反。
3、两个数相乘,在每一位相乘的过程中,有可能大于10的乘积,需要进位。所以要判断相乘后的积是否大于10,大于10需要进位。
每一次进位,相乘,都需要跟原来下标位置的值,进行相加,才能获得最终的值
4、在输出前,需要对这个数进行位数确定。从后到前查看碰到字符为0的就赋值为‘\0’,字符串以0结尾。
5、因为乘积是反向的,所以输出的时候需要再次取反。将这个数反向打印出来即可。
#include <iostream>
using namespace std;
int main() {
char a[], b[], c[] = {};
int i, j, k, l, A, B, C;
//输入第一个数
cin >> a;
//查看第一个数的长度
for (i = ; a[i] != '\0';++i) { }
A = i;
//将第一个数,位置取反
for (i = ; i <= (A - ) / ;++i) {
k = a[i];
a[i] = a[A - i - ];
a[A - i - ] = k;
}
//输入第二个数
cin >> b;
//查看第二个数的长度
for (i = ; b[i] != '\0';++i) {}
B = i;
//将第二个数,位置取反
for (i = ; i <= (B - ) / ;++i) {
k = b[i];
b[i] = b[B - i - ];
b[B - i - ] = k;
}
//两数相乘
for (i = ; i <= A - ;++i) {
for (j = ; j <= B - ;++j) {
C=(a[i]-) * (b[j]-);
k = i + j;
c[k] = c[k] + C;
C = c[k];
for (l = ; c[k + l] >= ;++l) {
c[k+l] = c[k + l] % ;
c[k + l + ] = C / + c[k + l+];
C = c[k+l+];
}
}
} //输出相乘后的数
for (i = ; c[i] == ;i--) {
if (c[i]==) {
c[i] = '\0';
}
}
j = i + ;
for (i = ; i < (j - )/;++i) {
k = c[i];
c[i] = c[j-i - ];
c[j - i - ] = k;
}
for (i = ; i < j;++i) {
printf("%d",c[i]);
}
}
C语言——<计算>_较大两个数相乘的更多相关文章
- C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)
公式法:两个数相乘等于最小公倍数乘以最大公约数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib ...
- C语言学习笔记frist---输入两个数比较大小
C#学习中,问道艰辛,今自C学起,第一个函数学习:输入两个数比较大小,仅作练习: #include "stdafx.h" #include<stdio.h> // 包含 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第1节 Scanner类_4-练习一_键盘输入两个数
导包语句其实不用我们自己去写, 选中后回车会自动的导入包 java.util 如果没有导入进来也可以,光标在关键字那里,ALT+回车 也会自动导入包 运行看一下结果:程序其实还有可以优化的地方 先输入 ...
- C语言使用memcpy函数实现两个数间任意位置的复制操作
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 用法:void *memcpy(void *dest ...
- C语言中不用 + 和 - 求两个数之和
(二)解题 题目大意:不用+或者-实现两个整数的加法 解题思路:不用+或者-,就自然想到位运算,无非就是与或非来实现二进制的加法 首先,我们来看一位二进制的加法和异或运算 A B A&B A^ ...
- 【C语言】用函数实现两个数排序(指针作函数参数)
原理就不讲了,这里用来理解指针的使用方法 #include <stdio.h> void fun(int* a,int* b) { int t; if(*a>=*b) { t = * ...
- c语言实现交换两个数的值
C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: // 异或, a^=b^=a^=b; a ^= b; b ^= a; a ^= b; // 加减 a = a + b; ...
- Coursera_程序设计与算法_计算导论与C语言基础_数组应用练习
您也可以在我的个人博客中阅读此文章:跳转 编程题#1:求字母的个数 描述 在一个字符串中找出元音字母a,e,i,o,u出现的次数. 输入 输入一行字符串(字符串中可能有空格,请用gets(s)方法把一 ...
- 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...
随机推荐
- DevExpress中Tile Application窗体的模型架构图
DEV中Tile Application模型架构比较复杂,整理一下和大家分享. 图中:立体代表类:虚线椭圆代表属性.
- Excel中使用VBA进行度分秒与十进制度的转换
发现Excel的VBA功能真是批量处理的一把利刃,工作中小试牛刀了一把,将Excel中度分秒形式的坐标批量处理成十进制度形式,处理完后用于GIS展点制图. 原Excel数据如下: VBA代码如下: S ...
- IDEA13 SVN配置
这个算是解决了,idea13是支持svn 1.8. 步骤: 1.下载svn客户端软件,小乌龟:TortoiseSVN.安装的时候,一定要选择安装svn命令行的那个选项.当前版本1.8默认只会忽略命令行 ...
- [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...
- 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类
前言 年底工作比较忙,年度总结还没写,项目要上线,回老家过年各种准备.尤其是给长辈给侄子侄女准备礼物头都大了. 原来想年前先出一版能用的,我看有点悬了,尽量先把大体功能弄出来,扔掉一些,保证能考试,然 ...
- 第五章 企业项目开发--mybatis注解与xml并用
本章的代码建立在第四章<Java框架整合--切分配置文件>的项目代码之上,链接如下: http://www.cnblogs.com/java-zhao/p/5118184.html 在实际 ...
- 机器学习、深度学习、和AI算法可以在网络安全中做什么?
本文由 网易云发布. 本文作者:Alexander Polyakov,ERPScan的首席技术官和联合创始人.EAS-SEC总裁,SAP网络安全传播者. 现在已经出现了相当多的文章涉及机器学习及其保 ...
- Android------------fragment数据传递
一.activity向fragment的数值之间的传递 关键点:fragment.setArguments(bundle);---->activity发出的信息 Bundle bund ...
- 日期时间类——Java常用类
时间戳(timestamp):距离特定时间的间隔. 计算机中的时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms). 格林尼治时间(GMT):是一个标准时间,用于全球 ...
- “全栈2019”Java多线程第十八章:同步代码块双重判断详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...