POJ 1001(大数相乘)
2016-07-27 14:49
323 查看
POJ1001
题意:输入m,n 求m的n次方。
/*需要注意的点太多了,没事就多打几遍*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int point;
void ridzero(char a[])
{
int i;
i = strlen(a) - 1;
while(a[i] == '0'){
a[i] = '\0';
i--;
}
}
void ridpoint(char a[])
{
int i,length;
length = strlen(a);
for(i = 0;i < length; i++) //判断是否有小数点
if(a[i] == '.')
break;
if(i != length){
for(i = length - 1;i >= 1; i--) //记录小数点的位置
if(a[i] != '.') point ++;
else break;
if(a[0] == '0'){ //小数点有两种情况,一是0.0***的形式,去除小数点
for(i = 2;i < length; i++)
if(a[i] != '0'){
strcpy(a,&a[i]);
break;
}
}
else { //这是***.**的形式,去除小数点
int flag = 0;
for(i = 1;i < length - 1; i++){
if(a[i] == '.') flag = 1;
if(flag) a[i] = a[i + 1];
}
a[i] = '\0';
}
}
}
void multiplication(char a[],char b[])
{
int i,j,k,c[410] = {0},sum;
int l = strlen(a) + strlen(b);
for(i = strlen(b) - 1;i >= 0; i--)
for(j = strlen(a) - 1,k = i + j + 1;j >= 0; j--,k--){ //注意k的作用是把结果存入c[k],其大小要比计算的位数大一位
sum = (a[j] - '0') * (b[i] - '0') + c[k];
c[k] = sum % 10;
c[k - 1] += sum / 10;
}
for(i = c[0]?0:1,j = 0;i < l; i++, j++)
a[j] = c[i] + '0';
a[j] = '\0';
}
void show(char a[])
{
int i,length;
length = strlen(a);
if(point >= length){
printf(".");
for(i = point - length;i > 0; i--)
printf("0");
printf("%s\n",a);
}
else {
for(i = 0;i < length; i++)
if(length - point == i){
cout<<"."<<&a[i];
break;
}
else cout<<a[i];
cout<<endl;
}
}
int main()
{
int i,n;
char str1[210],str2[210];
while(cin>>str1>>n){
if(n == 0){
printf("1\n");
continue;
}
point = 0;
ridzero(str1); //去掉多余的零
ridpoint(str1); //去掉小数点
strcpy(str2,str1);
for(i = 1;i < n; i++)
multiplication(str1,str2); //核心算法,大数相乘
point *= n; //记录小数点的位置
show(str1);
}
return 0;
}
题意:输入m,n 求m的n次方。
/*需要注意的点太多了,没事就多打几遍*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int point;
void ridzero(char a[])
{
int i;
i = strlen(a) - 1;
while(a[i] == '0'){
a[i] = '\0';
i--;
}
}
void ridpoint(char a[])
{
int i,length;
length = strlen(a);
for(i = 0;i < length; i++) //判断是否有小数点
if(a[i] == '.')
break;
if(i != length){
for(i = length - 1;i >= 1; i--) //记录小数点的位置
if(a[i] != '.') point ++;
else break;
if(a[0] == '0'){ //小数点有两种情况,一是0.0***的形式,去除小数点
for(i = 2;i < length; i++)
if(a[i] != '0'){
strcpy(a,&a[i]);
break;
}
}
else { //这是***.**的形式,去除小数点
int flag = 0;
for(i = 1;i < length - 1; i++){
if(a[i] == '.') flag = 1;
if(flag) a[i] = a[i + 1];
}
a[i] = '\0';
}
}
}
void multiplication(char a[],char b[])
{
int i,j,k,c[410] = {0},sum;
int l = strlen(a) + strlen(b);
for(i = strlen(b) - 1;i >= 0; i--)
for(j = strlen(a) - 1,k = i + j + 1;j >= 0; j--,k--){ //注意k的作用是把结果存入c[k],其大小要比计算的位数大一位
sum = (a[j] - '0') * (b[i] - '0') + c[k];
c[k] = sum % 10;
c[k - 1] += sum / 10;
}
for(i = c[0]?0:1,j = 0;i < l; i++, j++)
a[j] = c[i] + '0';
a[j] = '\0';
}
void show(char a[])
{
int i,length;
length = strlen(a);
if(point >= length){
printf(".");
for(i = point - length;i > 0; i--)
printf("0");
printf("%s\n",a);
}
else {
for(i = 0;i < length; i++)
if(length - point == i){
cout<<"."<<&a[i];
break;
}
else cout<<a[i];
cout<<endl;
}
}
int main()
{
int i,n;
char str1[210],str2[210];
while(cin>>str1>>n){
if(n == 0){
printf("1\n");
continue;
}
point = 0;
ridzero(str1); //去掉多余的零
ridpoint(str1); //去掉小数点
strcpy(str2,str1);
for(i = 1;i < n; i++)
multiplication(str1,str2); //核心算法,大数相乘
point *= n; //记录小数点的位置
show(str1);
}
return 0;
}
相关文章推荐
- 搭建struts2环境
- Android中Calendar类的用法总结
- 【iOS】Masonry使用案例讲解
- 浅析Java验证码生成库JCaptcha
- 【POJ】2503 - Babelfish(STL)
- 算法竞赛入门经典(第二版)-刘汝佳-第四章 发放救济金
- 203. Remove Linked List Elements
- android下大文件分割上传
- k-means和bp神经网络要点总结
- 用户级线程和内核级线程
- Matlab 和 C++混合编程
- time wait
- Android 5 消息机制源码分析
- 字符数字之间的转换
- HDU 5755 Gambler Bo(高斯消元解同余方程)
- Lua cocos2d
- gmt_offset变量是干什么的
- 开源软件53个相关概念
- servlet错误:HTTP Status 405 - HTTP method GET is not supported by this URL
- Leetcode 54. Spiral Matrix (Medium) (cpp)