数学问题
% 运算符
数位拆解
进制转换
-
输入两个不超过整形定义的非负10进制整数A和B,输出A+B的m进制数。
A , B < = 2 23 − 1 A, B <= 2^{23} - 1 A,B<=223−1输入样例: 样例输出: 8 1300 48 2504 2 1 7 1000 0
#include <iostream>
#include <string.h>
using namespace std;
void TenToM(long data, int m, int arr[], int &len) {
// 十进制到m进制的转换
long long temp = data;
len = 0;
while (temp) {
arr[len] = temp % m;
temp = temp / m;
len++;
}
}
void AddM(int m, int arr1[], int arr2[], int arr[], int l1, int l2, int &l) {
// m进制的两个数相加
int len = l1 < l2 ? l1 : l2;
l = l1 < l2 ? l2 : l1;
int index = 0;
int add = 0;
for (int i = 0; i < len; i++) {
add = arr1[i] + arr2[i] + index;
if (add >= m) {
index = 1;
add = add % m;
} else {
index = 0;
}
arr[i] = add;
}
if (l1 < l2) {
for(int i = len; i < l2; i++) {
add = arr2[i] + index;
if (add >= m) {
index = 1;
add = add % m;
} else {
index = 0;
}
arr[i] = add;
}
} else if (l1 > l2) {
for(int i = len; i < l1; i++) {
add = arr1[i] + index;
if (add >= m) {
index = 1;
add = add % m;
} else {
index = 0;
}
arr[i] = add;
}
}
if (index == 1) {
arr[l] = 1;
l += 1;
}
}
int main() {
int m;
long long A, B;
while(scanf("%d%lld%lld", &m, &A, &B) == 3) {
int arrA[32] = {
0};
int arrB[32] = {
0};
int ans[33] = {
0};
int lena = 0;
int lenb = 0;
int lenans = 0;
TenToM(A, m, arrA, lena);
TenToM(B, m, arrB, lenb);
AddM(m, arrA, arrB, ans, lena, lenb, lenans);
for(int i = lenans - 1; i >= 0; i--) {
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}
最大公约数
题目:求两个正整数的最大公约数
输入:两个正整数;
输出:最大公约数。
#include <iostream>
#include <string.h>
using namespace std;
int GCD(int a, int b) {
if (b == 0) return a;
return GCD(b, a % b);
}
int main() {
int a, b;
while(scanf("%d%d", &a, &b) != EOF) {
printf("%d\n", GCD(a, b));
}
return 0;
}
最小公倍数
最小公倍数的等于两个数的乘积除以他们的最大公约数。
#include <iostream>
using namespace std;
int GCD(int a, int b) {
return b != 0 ? GCD(b, a % b) : a;
}
int main() {
int a, b;
while(scanf("%d%d", &a, &b) != EOF) {
printf("%d\n", a * b / GCD(a, b));
}
return 0;
}
素数判定
- 输入一个数,判断这个数是否是素数。
#include <iostream>
#include <math.h>
using namespace std;
bool IsPrim(int n) {
// 0 1 负数都是非素数
if (n < 2) return false;
int index = (int)sqrt(n) + 1;
for (int i = 2; i < index; i++)
if (n % i == 0) return false;
return true;
}
int main() {
int a;
while(scanf("%d", &a) != EOF) {
if (IsPrim(a))
printf("yes\n");
else
printf("no\n");
}
return 0;
}
求解素数
给定一个数,给出这个数范围内的所有素数,并输出,最后一个数后面没有空格。
思路:从2开始,当遍历到一个数的时候将所有这个数的倍数标记为非素数,
所以当我们遍历到某个数的时候如果它没有被比它小的数标记为非素数的话它就是素数。
#include <iostream>
#include <stdio.h>
using namespace std;
int prime[10000]; // 保存找出的素数
int primenum = 0; // 保存找出的素数的个数
bool mark[10000] = {
false};
void init() {
// 找出所有小于10001的素数
for (int i = 2; i <= 10000; i++) {
if (mark[i] == false) {
prime[primenum++] = i;
// 从i*i开始标记是因为比i*i小的数据都在之前就有标记过了。
for (int j = i * i; j <= 10000; j += i)
mark[j] = true;
}
}
}
int main() {
i