阶乘之 和

题目

题目地址

知识点

Python打表

sum=0
fact=1
i=1
n=int(input())
while i<n:
    fact*=i
    sum+=fact        #end=""避免换行
    print('"',end="")#分开输出避免空格,python默认所有对象间都有空格
    print(sum,end="")#或者使用sep="",使用字符串""中的内容代替空格
    print('",',end="")#等价于print('"',sum,'",',sep='',end="")
    i+=1

C++大数和差运算

const int L = 110;			  //最多110位相加
string add(string a, string b)//两个非负整数相加
{
	string ans;				  //定义答案字符串(string类使用cin读入时遇空格视为结束)
	int na[L] = { 0 }, nb[L] = { 0 };//初始化两个数组
	int la = a.size(), lb = b.size();//取得数组长度
	for (int i = 0; i < la; i++)na[la - 1 - i] = a[i] - '0';//倒置字符串存储与整型数组
	for (int i = 0; i < lb; i++)nb[lb - 1 - i] = b[i] - '0';//字符转整数-'0'
	int lmax = la > lb ? la : lb;										 //记录两字符串得最大长度
	for (int i = 0; i < lmax; i++)na[i] += nb[i], na[i + 1] += na[i] / 10, na[i] %= 10;//整型数组求和,从低到高,此位超十则下一加一
	if (na[lmax])lmax++;												 //如果最长的长度进了一,则长度加一
	for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0';				 //倒转整型数组赋值给字符串ans,+=是string字符串运算符,作用是连接字符串(整数转字符+'0')
	return ans;
}
#include<bits/stdc++.h>
using namespace std;
const int L = 110;			  //最多110位相减
string sub(string a, string b)//两个非负整数相减(大数减小数)
{
	string ans;						 //答案字符串
	int na[L] = { 0 }, nb[L] = { 0 };//存储数字的数组
	int la = a.size(), lb = b.size();//获取字符串长度
	for (int i = 0; i < la; i++)na[la - i - 1] = a[i] - '0';
	for (int i = 0; i < lb; i++)nb[lb - i - 1] = b[i] - '0';//倒转字符串为数字
	int lmax = la > lb ? la : lb; //记录最大长度
	for (int i = 0; i < lmax; i++)//倒转相减
	{
		na[i] -= nb[i];//各位先减
		if (na[i] < 0)na[i] += 10, nb[i + 1] -= 1;//再看需不需要补
	}
	while (!na[--lmax] && lmax > 0); lmax++;//忽略掉开始前导零的段落(lmax>0为了至少有一位0,即相等相减时)
	for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0';//为了统一格式,上文lmax原本就是数字,lmax++就为前导零,lmax-1就是第一个数字
	return ans;//返回答案数字字符串						 //逆转转换为字符串+'0'
}

C++大数乘法运算

string mul(string a, string b)//两个非负整数相承
{
	string ans;//存储答案的数组
	int na[L], nb[L], nc[L], la = a.size(), lb = b.size();//变量
	fill(na, na + L, 0); fill(nb, nb + L, 0); fill(nc, nc + L, 0);//初始化数组
	for (int i = la - 1; i >= 0; i--)na[la - i ] = a[i] - '0';//从1开始赋值直到la
	for (int i = lb - 1; i >= 0; i--)nb[lb - i ] = b[i] - '0';
	for (int i = 1; i <= la; i++)//从第一位开始
		for (int j = 1; j <= lb; j++)//乘以对方每一位
			nc[i + j - 1] += na[i] * nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(注意是+=,因为其他位运算也会影响此位)
	for (int i = 1; i <= la + lb; i++)
		nc[i + 1] += nc[i] / 10, nc[i] %= 10;//统一进位!
	if (nc[la + lb])ans += nc[la + lb] + '0';//运算时i+j-1则最高位为la+lb-1,可能进一位到la+lb
	if (a == "0" || b == "0")la = 2, lb = 0;
	for (int i = la + lb - 1; i >= 1; i--)   //再倒转存入ans数组(ans+=,从尾开始即可)
		ans += nc[i] + '0';
	return ans;//返回运算结果
}

解题代码

包含知识:字符中的数字

#include<bits/stdc++.h>
using namespace std;
const int L = 110000;			  //最多110位相乘
string mul(string a, string b)//两个非负整数相承
{
	string ans;//存储答案的数组
	int na[L], nb[L], nc[L], la = a.size(), lb = b.size();//变量
	fill(na, na + L, 0); fill(nb, nb + L, 0); fill(nc, nc + L, 0);//初始化数组
	for (int i = la - 1; i >= 0; i--)na[la - i ] = a[i] - '0';//从1开始赋值直到la
	for (int i = lb - 1; i >= 0; i--)nb[lb - i ] = b[i] - '0';
	for (int i = 1; i <= la; i++)//从第一位开始
		for (int j = 1; j <= lb; j++)//乘以对方每一位
			nc[i + j - 1] += na[i] * nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(注意是+=,因为其他位运算也会影响此位)
	for (int i = 1; i <= la + lb; i++)
		nc[i + 1] += nc[i] / 10, nc[i] %= 10;//统一进位!
	if (nc[la + lb])ans += nc[la + lb] + '0';//运算时i+j-1则最高位为la+lb-1,可能进一位到la+lb
	for (int i = la + lb - 1; i >= 1; i--)   //再倒转存入ans数组(ans+=,从尾开始即可)
		ans += nc[i] + '0';
	return ans;//返回运算结果
}

string add(string a, string b)//两个非负整数相加
{
	string ans;				  //定义答案字符串(string类使用cin读入时遇空格视为结束)
	int na[L] = { 0 }, nb[L] = { 0 };//初始化两个数组
	int la = a.size(), lb = b.size();//取得数组长度
	for (int i = 0; i < la; i++)na[la - 1 - i] = a[i] - '0';//倒置字符串存储与整型数组
	for (int i = 0; i < lb; i++)nb[lb - 1 - i] = b[i] - '0';//字符转整数-'0'
	int lmax = la > lb ? la : lb;										 //记录两字符串得最大长度
	for (int i = 0; i < lmax; i++)na[i] += nb[i], na[i + 1] += na[i] / 10, na[i] %= 10;//整型数组求和,从低到高,此位超十则下一加一
	if (na[lmax])lmax++;												 //如果最长的长度进了一,则长度加一
	for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0';				 //倒转整型数组赋值给字符串ans,+=是string字符串运算符,作用是连接字符串(整数转字符+'0')
	return ans;
}

int main()
{
	while (1) {
		string sum, fact, c;//大数运算转换为字符串运算
		int n;
		cin >> n;
		fact = "1";//fact计算阶乘
		sum = "0"; //sum记录和值(都是字符串化的"数字")
		for (int i = 1; i <= n; i++)
		{
			int t = i;
			c = "";//初始化c
			while (t > 0)//由于i可能有多位,所以要转换为字符串
				c += t % 10+'0', t /= 10;//数字+'0'才是字符中对应的数字(以便显示)
			for (int j = 0; j < c.size()/2; j++)
				swap(c[j],c[c.size() - j - 1]);//逆转数组
			fact = mul(fact, c); //求阶乘
			sum = add(fact, sum);//求和
		}
		cout << sum << endl;
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望—星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值