1、进制转换
描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子处理多组输入的问题。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例1
输入:
0xA
0xAA
输出:
10
170
# function to convert given hexadecimal Value
# to an integer (decimal number)
def HexToDec(value):
try:
return int(value, 16)
except ValueError:
return "Invalid Hexadecimal Value"
#Main code
HexNum1 = input()
HexNum2 = input()
print(HexToDec(HexNum1))
print(HexToDec(HexNum2))
2、质数因子
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入:
180
输出:
2 2 3 3 5
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
string getResult(long input) {
int i = 0,j,n,k=0;
int qualitive[10000];
string result="";
//获得质数数组
bool flag;
for(n=2;n<=input;n++)
{
flag=0;//每次内层循环结束后将flag再次赋值为0
for (j=2;j<n;j++)
{
if (n%j == 0)
flag=1;
}
if (flag == 0)
{
qualitive[k]=n;
k++;
}
}
//获取质因数
for (; input >= 2 & i <= input;) {
if(input%qualitive[i]==0){
result += to_string(qualitive[i]) + " ";
input /= qualitive[i] ;
}
else {
i++;
}
}
return result;
}
int main() {
long input;
cin >> input;
cout << getResult(input);
return 0;
}
但是系统给出的数据包含64577(质数),计算复杂度太大,经过多次调试仍然没有通过测试
但是正如我们判断数 num 是不是质数时,没必要从 2 一直尝试到 num 一样,此题中的大循环也大可不必写一个到 num 的循环,写到 即可,如果此时数字还没有除数,则可判定其本身是一个质数,没有再除下去的必要了,直接打印其本身即可:
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int main() {
long input,sqrt_input;
string result = "";
cin >> input;
sqrt_input = sqrt(input);
for(long i=2;i <= sqrt_input; ++i)
{
while(input % i == 0)
{
result += to_string(i)+" ";
input /= i;
if(i == sqrt_input)
{
result += to_string(input)+" ";
}
}
}
cout<<result<<endl;
return 0;
}
然鹅,还是没有通过测试
于是,在网上一通搜寻,搜到了一位c大佬的代码,以下分享
分解质因数,从最小的开始不停除法,除到为1。或者,除到最后除不了,就输出自己。
有两个坑。第一个就是这个数本身是个质数。第二就是可能会超时,除到它的平方值即可。
还可以判断下除数是不是质数,但是呢,没必要,因为会增加判断的次数,得不偿失。
#include<stdio.h>
#include<math.h>
int main()
{
long num = 0;
int i;
while (scanf("%ld", &num) != EOF) {
int maxi = sqrt(num);
for (i = 2; i <= maxi; i++) {
while (!(num % i)) {
num /= i;
printf("%d ", i);
}
}
if (num != 1) {
printf("%d ", num);
}
printf("\n");
}
return 0;
}