目录
9、数学问题
1)进制转换
1.二进制数(北京邮电大学复试上机题)
2.进制转换(清华大学复试上机题)
3.十进制与二进制(清华大学复试上机题)
4.进制转换 2(清华大学复试上机题)
5.八进制(华中科技大学复试上机题)
6.又一版 A + B(浙江大学复试上机题)
7.进制转换(北京大学复试上机题)
2)最大公约数与最小公倍数
1.最大公约数(哈尔滨工业大学复试上机题)
2.最小公倍数
3.最简真分数(北京大学复试上机题)
3)质数
1.素数判定(哈尔滨工业大学复试上机题)
2.素数(北京航空航天大学复试上机题)
3.Prime Number(上海交通大学复试上机题)
4)分解质因数
1.质因数的个数(清华大学复试上机题)
2.约数的个数(清华大学复试上机题)
5)快速幂
1.人见人爱 A^B
6)矩阵与矩阵快速幂
1.计算两个矩阵的乘积(哈尔滨工业大学复试上机题)
2.A + B for Matrices(浙江大学复试上机题)
10、贪心
1)简单贪心
1.鸡兔同笼(北京大学复试上机题)
2)区间贪心
1.今年暑假不 AC
9、数学问题
1)进制转换
1.二进制数(北京邮电大学复试上机题)
题目描述:
大家都知道,数据在计算机中是以二进制形式存储的。有一天,小明在学习C 语言时,想知道一个类型为 unsigned int 的数字存储在计算机中的二进制串是什么样子的。你能帮帮小明吗?注意,小明不想要二进制串中前面没有意义的 0 串,即要去掉前导 0。
#include <bits/stdc++.h>
using namespace std;int main(){int n;stack<int> s;cin>>n;while(n != 0){s.push(n%2);n /= 2;}while(!s.empty()) {cout<<s.top();s.pop();}return 0;
}
2.进制转换(清华大学复试上机题)
题目描述:
将一个长度最多为 30 位数字的十进制非负整数转换为二进制数。
#include <bits/stdc++.h>
using namespace std;string str;void divide(){int remain=0; //保留余数for(int i=0;i<str.size();++i){int t = remain * 10 + str[i] - '0';remain = t % 2;str[i] = t / 2 + '0';}while(str[0]=='0'){ //对于字符串除***有得到的商最前面有0,必须把0删除str.erase(0,1);}
}int main(){while(getline(cin,str)){stack<int> s;while(str.size() > 0){s.push((str[str.size() - 1] - '0') % 2);divide();}while(!s.empty()){cout<<s.top();s.pop();}cout<<endl;}return 0;
}
3.十进制与二进制(清华大学复试上机题)
题目描述:
对于一个十进制数 A,将 A 转换为二进制数,然后按位逆序排列,再转换为十进制数B,B即为A 的二进制逆序数。例如,对于十进制数 173,其二进制形式为 10101101,逆序排列得到10110101,其十进制数为 181,181 即为 173 的二进制逆序数。
#include <bits/stdc++.h>
using namespace std;string Divide(string str, int x){int remainder = 0;for(int i = 0;i < str.size();i++){int current = remainder * 10 + str[i] - '0';str[i] = current / x + '0';remainder = current % x;}int pos = 0;while(str[pos] == '0') pos++;return str.substr(pos);
}string Multiple(string str,int x){int carry = 0;for(int i = str.size() - 1;i >= 0;--i){int current = x * (str[i] - '0') + carry;str[i] = current % 10 + '0';carry = current / 10;}if(carry != 0) str = "1" + str;return str;
}string Add(string str,int x){int carry = x;for(int i = str.size() - 1;i >= 0;--i){int current = (str[i] - '0') + carry;str[i] = current % 10 + '0';carry = current / 10;}if(carry != 0) str = "1" + str;return str;
}int main(){string str;while(cin>>str){vector<int> binary;while(str.size() != 0){int last = str[str.size() - 1] - '0';binary.push_back(last % 2);str = Divide(str, 2);}string answer = "0";for(int i = 0;i < binary.size();i++){answer = Multiple(answer,2);answer = Add(answer,binary[i]);}cout<<answer<<endl;}return 0;
}
4.进制转换 2(清华大学复试上机题)
题目描述:
将 M 进制的数 X 转换为 N 进制的数并输出。
#include <bits/stdc++.h>
using namespace std;//数字转字符
char intToChar(int x){if(x < 10) return x + '0';else return x - 10 + 'a';
}//字符转数字
int charToInt(char c){if(c >= '0' && c <= '9') return c - '0';else return c - 'A' + 10;
} int main(){int M,N;cin>>M>>N;string str;cin>>str;long long number = 0;for(int i = 0;i < str.size();i++){number *= M;number += charToInt(str[i]);}vector<char> answer;while(number != 0){answer.push_back(intToChar(number % N));number /= N;}for(int i = answer.size() - 1;i >= 0;--i){cout<<answer[i];}cout<<endl;return 0;
}
5.八进制(华中科技大学复试上机题)
题目描述:
输入一个整数,将其转换成八进制数并输出。
#include <bits/stdc++.h>
using namespace std;int main(){int n;stack<int> s;while(cin>>n){if(n == 0){cout<<0<<endl;return 0;}int answer = 0;while(n != 0){s.push(n%8);n /= 8; }while(!s.empty()){cout<<s.top();s.pop();}cout<<endl;}return 0;
}