poj2305-Basic remains(进制转换 + 大整数取模)

  进制转换 + 大整数取模
一,题意:
  在b进制下,求p%m,再装换成b进制输出。
  其中p为b进制大数1000位以内,m为b进制数9位以内
二,思路:
  1,以字符串的形式输入p,m;
  2,转换:字符串->整数 十进制->b进制;
  3,十进制下计算并将整形结果转换成字符串形式,并倒序储存;
  4,输出。
三,步骤:
  1,输入p[],m[];
  2,字符串->整形 + 进制->b进制:
    i,进制转换语句:m2 = m2*b + m[j]-‘0‘;
    ii,大整数取模,大整数可以写成这样的形式:
    12345 = ( ( (1 * 10+2) * 10+3) * 10+4) * 10+5
    如二进制数(1100)=( ( (1 * 2+1) * 2+0) * 2+0) (2表示进制数)
    为避免大数计算,进制转化时顺便求模
    p2 = (p2*b + p[i]-‘0‘) % m2;
  3,转换并倒序储存: ans[k++] = p2%b + ‘0‘; p2 /= b ;
  4,倒序输出

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 const int N=1010;   //大数位数
 5
 6 int main(){
 7     int b;       //进制数
 8     while(cin>>b&&b){
 9         char p[N] , m[N] , ans[N];
10         int p2 = 0 , m2 = 0;  //定义用来储存十进制的被除数、除数
11         cin>>p>>m;
12         for(int j=0 ; j<strlen(m) ; j++){  //把n进制字符串除数转换为十进制数字除数
13             m2 = m2*b + m[j]-‘0‘;
14         }
15         for(int i=0 ; i<strlen(p) ; i++){  //把n进制字符串被除数转换为十进制数字被除数
16             p2 = (p2*b + p[i]-‘0‘) % m2;   //为避免大数计算,进制转化时顺便求模
17         }
18         if(!p2)
19             cout<<0<<endl;
20         else{
21             int k = 0;
22             while(p2){
23                 ans[k++] = p2%b + ‘0‘; //把10进制数 转换为 n进制字符串倒序并存入 P[] 中
24                 p2 /= b;
25             }
26             for(int i = k-1 ; i >= 0 ; i--)
27                 cout<<ans[i];
28             cout<<endl;
29         }
30     }
31     return 0;
32 }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 21:31:38

poj2305-Basic remains(进制转换 + 大整数取模)的相关文章

Big Number(大整数取模)

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4789    Accepted Submission(s): 3329 Problem Description As we know, Big Number is always troublesome. But it's really important in ou

【数论】2016中国大学生程序设计竞赛 - 网络选拔赛 A. A water problem (大整数取模)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5832 题意:两个星球,一个星球一年只有137天,一个星球一年只有73天 输入N(爆炸后第N天),判断这是否为这两个星球的第一天 只要这个数是137与73的公倍数就好了(0比较特殊) 坑点:N的长度不超过10000000 只能用字符串来存储 大整数整除:紫书P314 大整数整除:首先把大整数写成"自左向右"的形式:1234 = (((1*10)+2)*10+3)*10+4 然后每步取模 代码 1

FZU 1759-Super A^B mod C(快速幂+大整数取模+欧拉函数)

题目链接:点击打开链接 题意:计算 a^b %c 但其中b很大,可能会达到10^1000000, 故有降幂公式 a^b %c= a^(b%phi(c)+phi(c)) %c  (b>=phi(c)) #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #

大整数取模运算出现运算结果负数的解决方案

首先我们看个例子 <?php echo 12121212121 % 1000000; //结果为 -689767 //实际应该为12121 ?> 这里的取模运算(取余数)出现了BUG.那么需要声明一下,负数也是可以取模操作的,并不是出现负数就是不对的我们应该把这种长整数类型看成float型数据进行处理介绍一个函数float fmod ( float $x , float $y )返回除法的浮点数余数通过这个函数的运算,就可以得到原本想要的余数结果 <?php $a = floatval(

大整数取模,秦九韶

#include <stdio.h> #include <string.h> #define MAXN 1000005 char s[MAXN]; int main () { int t; scanf("%d",&t); while(t--) { getchar(); int mod; scanf("%d",&mod); scanf("%s",s); int len = strlen(s); int ans

A water problem 大整数取模

A water problem Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 5814    Accepted Submission(s): 1238 Problem Description Two planets named Haha and Xixi in the universe and they were created wit

大整数取模

#include<cstdio> #include<cstdlib> #include<cstring> #define N 10000 int main() {     char str[N];     int len;int i;     int mod;     int ans=0;     int Case;     scanf("%d",&Case);     while(Case--){     scanf("%s&qu

【ACM】大数据+任意进制转换 jobdu 1080

[九度OJ] 1080 进制转换 题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36).下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出. 输出: 输出X的N进制表示的数. 样例输入: 16 10 F 样例输出: 15 提示: 输入时字母部分为大写,输出时为小写,并且有大数据. 这题考察的比较综合,进制转换+大数据 很久没有做ACM的题目了,且拿这个练练手,大整数模板是用的王道论坛的模板-贴出来备

进制转换问题

package jinzhizhuanhuan; import java.math.BigInteger; import java.util.Scanner; /** * 题目意思很简单,实现16以内的进制之间的转换,将一个n进制的数转换为一个m进制的数. 输入:每行包括3个字符串,第一个表示要转换的n进制的数,第二个表示基数n,第三个表示基数m 输出:屏幕按格式显示七位的转换结果,如果多于七位,输出" ERROR" * @author Administrator * */ publi