首页 > 其他分享 >洛谷题单指南-数学基础问题-P1017 [NOIP2000 提高组] 进制转换

洛谷题单指南-数学基础问题-P1017 [NOIP2000 提高组] 进制转换

时间:2024-04-07 15:34:13浏览次数:24  
标签:NOIP2000 进制 rr int 洛谷题 P1017 res 余数 ......

原题链接:https://www.luogu.com.cn/problem/P1017

题意解读:负进制数的转换。

解题思路:

下面给出两种思路

1、枚举法

从数据范围来看,∣n∣ ≤ 37336,因此,可以对该r进制的数进行枚举,每一次枚举,都计算r进制数对应的十进制数是否和n相等,相等则输出该r进制数。

主要问题就是要解决r进制数如何表示?

类似于高精度,可以用数组来表示一个r进制数,如二进制1101表示为int a[] = {1, 0, 1, 1}

枚举起始时,a[] = {0},每一次最低位+1,a[0]++,如果a[0] = |r|,处理进位。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int a[100], cnt = 1;
int n, r;

//将r进制的a[]转换为十进制数
int trans()
{
    int res = 0;
    for(int i = cnt - 1; i >= 0; i--)
    {
        res = res * r + a[i];
    }
    return res;
}

char getchar(int x)
{
    char res = '0';
    if(x >= 0 && x <= 9) res = x + '0';
    if(x >= 10) res = x - 10 + 'A';
    return res;
}

int main()
{
    cin >> n >> r;
    int R = -r; //r是负数,R = abs(r)
    while(n != trans()) //如果r进制数a转换十进制后不等于n
    {
        int d = 1;
        for(int i = 0; i < cnt; i++) //给r进制数a加1
        {
            a[i] += d;
            d = a[i] / R;
            a[i] %= R;
        }
        if(d) a[cnt++] = d;
    }
    cout << n << "=";
    for(int i = cnt - 1; i >= 0; i--) cout << getchar(a[i]);
    cout <<  "(base" << r << ")";
    return 0;
}

2、除留余数法

能不能基于进制转换的标准算法来做呢,

例如:-15转-2进制的过程,理论上应该是这样的:

-15 ➗ -2 = 8 ...... 1

8 ➗ -2 = -4 ...... 0

-4 ➗ -2 = 2 ...... 0

2 ➗ -2 = -1 ...... 0

-1 ➗ -2 = 1 ...... 1

                       1

逆序输出就是110001

但实际上,在C++中,计算结果是这样的

-15 ➗ -2 = 7 ...... -1

8 ➗ -2 = -4 ...... 0

-4 ➗ -2 = 2 ...... 0

2 ➗ -2 = -1 ...... 0

-1 ➗ -2 = 0 ...... -1

可以看到,当负数除以负数时,余数是负数,而我们要求余数必须为正,就可以通过给余数增加|r|来修正

既然余数增加了|r|,对应商就应该加1,通过如此修正就得到了手工计算一样的结果。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n, r;

char getchar(int x)
{
    char res = '0';
    if(x >= 0 && x <= 9) res = x + '0';
    if(x >= 10) res = x - 10 + 'A';
    return res;
}

int main()
{
    cin >> n >> r;
   
    int nn = n, rr; //nn商,rr余数
    vector<int> ans;
    while(nn)
    {
        rr = nn % r;
        nn /= r;
        if(rr < 0) //余数小于0
        {
            rr -= r; //余数加|r|
            nn++; //商加1
        }
        ans.push_back(rr);
    }
    cout << n << "=";
    for(int i = ans.size() - 1; i >= 0; i--) cout << getchar(ans[i]);
    cout <<  "(base" << r << ")";
    return 0;
}

 

标签:NOIP2000,进制,rr,int,洛谷题,P1017,res,余数,......
From: https://www.cnblogs.com/jcwy/p/18119143

相关文章

  • 洛谷题单指南-数学基础问题-P1100 高低位交换
    原题链接:https://www.luogu.com.cn/problem/P1100题意解读:将32位二进制数的高低16位交换位置。解题思路:给定无符号整数a,假设二进制高16为h,低16位为l,即a表示为hl,a>>16得到0h,a<<16得到l0,两者相加即得到lh,交换完毕。需要注意的是,无符号整数的表示是unsignedint,如果是int,......
  • 洛谷题单指南-数学基础问题-P1469 找筷子
    原题链接:https://www.luogu.com.cn/problem/P1469题意解读:找到落单的整数,其他整数都可以配对。解题思路:利用异或的特性:1、整数和自己异或x^x=02、任何数和0异或x^0=x因此,将所有数异或起来,结果就是落单的整数。100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-数学基础问题-P1143 进制转换
    原题链接:https://www.luogu.com.cn/problem/P1143题意解读:进制转换的模版题,n进制转10进制,10进制转m进制。解题思路:1、对于n进制数转10进制,如abcd转10进制,根据定义是a*n^3+b*n^2+c*n+d,在程序中迭代处理:for(inti=0;i<s.length();i++)dec=dec*n+s[i]需要注......
  • 洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级
    原题链接:https://www.luogu.com.cn/problem/P1983题意解读:由于“如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠”。因此,在始发站和终点站之间,能停靠的车站都是级别较高的,没有停靠的车站都是级别较低的,计算最少有多少个不同级别。解题思路:......
  • 洛谷 P1004 [NOIP2000 提高组] 方格取数
    题意:n*n的方格,从左上角到右下角两次。每一次经过的路径中,如果有数字,数字都会变成0并计数。求两次路径的最大计数。思路:线性dp,从左上角到右下角步数固定为2*n-2步。初始时0步dp[0][1][1]=grid[1][1],知道了x1和x2可以确定对应的y,可以直接进行状态转移。可以增加剪枝:x<=m......
  • 洛谷题单指南-图的基本应用-P1347 排序
    原题链接:https://www.luogu.com.cn/problem/P1347题意解读:在给出多对关系字母的比较关系之后,判断能否确定所有字母的顺序。解题思路:对字母的关系建立图,如A<B建立A指向B的一条边。如果在拓扑排序过程中,每次寻找入度为0的点只有一个,且最终可以形成拓扑序,则可以确定所有字母的顺......
  • 洛谷题单指南-图的基本应用-P1363 幻象迷宫
    原题链接:题意解读:迷宫可以无限扩展,对第一个样例进行模拟,扩展4块的示意图:从起点S,沿着红色虚线,是可以无限走下去的,要判断是否能够无限走下去。解题思路:直观上,会考虑把迷宫复制多块,但是会面临2个问题:1、内存可能爆掉2、如何有效判断可以无限走下去?只考虑竖向或者横向连通是不......
  • 【洛谷】P1004 [NOIP2000提高组]方格取数
    题目描述题目描述设有N×N 的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为......
  • 洛谷题单指南-图的基本应用-P2853 [USACO06DEC] Cow Picnic S
    原题链接:https://www.luogu.com.cn/problem/P2853题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。解题思路:直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。100分代码:#include<bi......
  • 洛谷题单指南-图的基本应用-P1127 词链
    原题链接:https://www.luogu.com.cn/problem/P1127题意解读:按字典序排列单词,使得相邻单词的首位字母一样。解题思路:由于单词之间可以相邻的条件是前一个单词的末尾字母和后一个单词的开头字母一样,因此可以遍历每一个单词,再找到每一个可以接在其后面的单词,建立一个邻接表,然后从......