求M的N次方的最后三位

#include <stdlib.h>
#include <iostream>
#include "oj.h"
using namespace std;
//思路:每次相乘,仅保留积的最后三位
unsigned int  GetLastThreeNumOfResult (unsigned int  m, unsigned int  n)
{
	unsigned int result = m %1000;
	
	for (int i =1; i < n ;++i)
	{
		result = (result*m)%1000;
	}
	return result;
}

int main()
{
	int m,n;
	while (cin>>m>>n)
	{
		cout<<GetLastThreeNumOfResult(m,n)<<endl;
	}
	return 0;
}

高精度计算2的n次方,通常用于处理结果超出基本数据类型表示范围的情况,因为当n较大时,2的n次方会非常大,普通的整数类型(如int、long long)无法存储。以下是几种常见的实现方法: ### 方法一:使用数组模拟竖式乘法 该方法通过数组来存储每一位数字,模拟乘法和进位的过程。以下是C++代码示例: ```cpp #include <iostream> #include <cmath> using namespace std; //用数组模拟竖式乘法 const int N = 3010; int main() { int a[N] = {1}, size = 1; int n; cin >> n; for (int i = 0; i < n; i++) { int t = 0; for (int j = 0; j < size; j++) { int m = a[j]; a[j] = (m * 2 + t) % 10; t = (m * 2 + t) / 10; } if (t > 0) a[size++] = t; //一轮乘法结束,判断最高位是否需要进一 } //输出(倒着输出) cout << "计算结果:"; for (int i = size - 1; i >= 0; i--) { cout << a[i]; } cout << endl; cout << "pow函数结果:" << (int) pow(2, n); return 0; } ``` 此代码中,数组`a`用于存储结果的每一位数字,`size`表示当前结果的位数。每次循环将数组中的每一位乘以2,并处理进位,最后输出结果[^3]。 ### 方法二:利用数组存储并处理进位 这种方法同样使用数组存储结果,通过两次循环,一次进行乘法,一次进行进位处理。以下是C++代码示例: ```cpp #include<cstring> //memset()的头文件 #include<iostream> using namespace std; int n,ans[2500],j; //由于数字太大,只能用数组表示 int main() { cin>>n; memset(ans,-1,sizeof(ans)); //将ans全部变成-1 ans[0]=2; //第一项要等于2 for(int i=0;i<n-1;i++) //由于第一项已经是2,所以循环n-1次 { j=-1; //j从-1开始 while(ans[j+1]!=-1) //一旦遇到-1,退出循环 { ans[++j]*=2; //将每一位都乘2 } j=0; while(ans[j]!=-1) //进位 { if(ans[j]>=10&&ans[j+1]==-1) ans[j+1] = 0; ans[j+1]+=ans[j]/10; ans[j]%=10; j++; } } for(int i=j-1;i>=0;i--) //输出 { cout<<ans[i]; } return 0; } ``` 该代码中,先将数组初始化为-1,第一项设为2,然后进行n - 1次乘法和进位处理,最后倒序输出结果[^1]。 ### 方法三:简洁的数组实现 同样是使用数组存储结果,代码更加简洁。以下是C++代码示例: ```cpp #include<bits/stdc++.h> using namespace std; int main(){ int n,s[1501]={1}; cin>>n; for(int i=0;i<n;i++){ // s=s*2; for(int j=0;j<1501;j++){ s[j]=s[j]*2; } for(int j=0;j<1501;j++){ s[j+1]=s[j+1]+s[j]/10; s[j]=s[j]%10; } } for(int j=1500;j>=0;j--){ if(s[j]!=0){ for(int i=j;i>=0;i--){ cout<<s[i]; } break; } } return 0; } ``` 此代码先将数组初始化为1,然后进行n次乘法和进位处理,最后从高位开始找到第一个非零数字,倒序输出结果[^4]。 ### 方法四:C语言实现 使用C语言实现,同样是利用数组存储结果并处理进位。以下是代码示例: ```c #include<stdio.h> int main(){ int n; scanf("%d",&n); int a[100000]={1}; if(n<0) return 0; int p = 1; for(int i = 1; i <= n; i++){ int sum = 0; for(int i = 0; i < p; i++){ a[i] = a[i]*2 + sum; sum = a[i]/10; if(i == p - 1) p += sum; a[i] %= 10; } } for(int i = p - 1; i >= 0; i--) printf("%d",a[i]); return 0; } ``` 该代码中,数组`a`用于存储结果,`p`表示当前结果的位数。通过循环进行n次乘法和进位处理,最后倒序输出结果[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值