两个超大整数求和。控制台输入两个30位以内超大整数,且其中至少有一个数大于18446744073709551615,程序能将两个数相加的结果输出。
// lzy 2018.7.29 于东北大学
//仅代表东北大学最低编程水平,才疏学浅,欢迎各位参考指摘!
//定义了一个BigNumber类,用于存放超大数(大于long long double)
//此代码用于30位以内数字相加,可根据需要修改参数
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <cstdlib>
using namespace std;
//定义了BigNumber类
class BigNumber
{
public:
BigNumber();
~BigNumber();
void ShowNum();
void InputNum();
int Length();
friend BigNumber Add(BigNumber a, BigNumber b);
private:
char s[40];
};
//构造函数
BigNumber::BigNumber()
{
cout << "Constructor has been called." << endl;
int i;
for (i = 0; i < 40; i++)
s[i] = '0';
}
//析构函数
BigNumber::~BigNumber()
{
cout << endl << " Deconstructor has been called." << endl;
}
//输入数据
void BigNumber::InputNum()
{
int i;
for (i = 29; i >= 0 && s[i + 1] != '\n'; i--)
scanf_s("%c", &s[i]);
s[i+1] = '0';
}
//求数字长度并返回长度
int BigNumber::Length()
{
int loc = 0;
while (s[loc] == '0')
loc++;
loc = 29 - loc;
return loc + 1;
}
//向屏幕输出数据
void BigNumber::ShowNum()
{
int i;
if (Length() == 0)
cout << "0" << endl;
else
for (i = 29; i > 29 - Length(); i--)
cout << s[i];
}
//定义了取两数较大数的函数,也可利用库函数
int max(int a, int b)
{
if (a >= b) return a;
return b;
}
//加法运算
BigNumber Add(BigNumber a, BigNumber b)
{
int temp = 0, i, m, n, length = max(a.Length(), b.Length());
int move = abs(a.Length() - b.Length());
//将a,b的长度都存入了一个新的变量,因为后面操作可能会改变Length()的返回值
int aa = a.Length();
int bb = b.Length();
//将数字从个位向高位依次对其
//a长度大于b,移动b中元素
if (a.Length() > b.Length())
{
int times = b.Length();
for (n = 0; n < times; n++)
b.s[30 - times - move + n] = b.s[30 - times + n];
for (int m = 30 - move; m < 30; m++)
b.s[m] = '0';
}
//a长度小于b,移动a中元素
else if (a.Length() < b.Length())
{
int times = a.Length();
for (n = 0; n < times; n++)
a.s[30 - times - move + n] = a.s[30 - times + n];
for (int m = 30 - move; m < 30; m++)
a.s[m] = '0';
}
//创建一个新的BigNumber用于存储结果
BigNumber c;
//从最低位开始加法运算
for (i = 29 - length; i <= 29; i++)
{
if (temp == 1)//进位
c.s[i] = (a.s[i] - 48) + (b.s[i] - 48) + 1;
else //不进位
c.s[i] = (a.s[i] - 48) + (b.s[i] - 48);
if (c.s[i] > 9)//如果本位相加结果大于9,利用temp控制进位(temp == 1时)
{
if (i == 29)//最高位相加进位,造成假上溢,再开辟一位,取值1
{
c.s[i] = c.s[i] % 10;
c.s[30] = 1;
}
else
{
c.s[i] = c.s[i] % 10;
temp = 1;//temp用于确定下一次加法运算位(高位)是否有进位
}
}
else temp = 0;
}
if (c.s[30] == 1)//假上溢情况发生,输出比原来较长的数还多一位
{
for (i = 30; i > 30 - c.Length(); i--)
cout << char(c.s[i] + 48);
}
else
{
for (i = 29; i > 30 - c.Length(); i--)
cout << char(c.s[i] + 48);
}
return c;
}
int _tmain(int argc, _TCHAR* argv[])
{
BigNumber a, b;
a.InputNum();
b.InputNum();
Add(a, b);
system("pause");
return 0;
}
- (华为机考题)通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- 通过键盘输入100 以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: 1、操作数为
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- 机试题:过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- 华为机试通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 华为机试——通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- js:制作一个简易的计数器:根据输入的两个整数和运算符,进行计算,然后输出计算结果
- 51.从键盘上输入任意两个数和一个运算符(+、-、*、/),根据输入的运算符对两个数计算,并输出结果
- 1.编写一个简单的C语言程序:根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。 2.编写一个C语言程序:打印输出所有“水仙花数”,用gdb调试程序(给出步骤)。所谓“
- 5.编写一个程序,有两个类,其中类MAX中具有两个方法,方法名都是max,一个方法能够比较两个数的大小,另外一个方法能够比较三个数的大小。在另外一个类中创建对象,调用这两个方法,分别输出两组数:2、6
- JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 1.编写一个简单的C语言程序:根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。 2.编写一个C语言程序:打印输出所有“水仙花数”,用gdb调试程序(给出步骤)。所谓“
- 编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 读取一个在0-99999之间的整数,将该整数的各位数字相加,如求和结果大于9,则继续对所获得的结果数字按各位相加求和,直至求出的和值小于10。