#include <cstdio>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
void to_array(int n,int num[]){
for(int i=0;i<4;i++){
num[i]=n%10;
n /=10;
}
}
int to_number(int num[]){
int sum=0;
for(int i=0;i<4;i++){
sum=sum*10+num[i];
}
return sum;
}
int main(){
int n,MIN,MAX;
scanf("%d",&n);
int num[5];
while(1){
to_array(n,num);
sort(num,num+4);
MIN=to_number(num);
sort(num,num+4,cmp);
MAX=to_number(num);
n=MAX-MIN;
printf("%04d-%04d=%04d\n",MAX,MIN,n);
if(n==0||n==6174)break;
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <cmath>
int main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int delta = b * b - 4 * a * c;
if (delta < 0) {
printf("No Solution");
} else if (delta == 0) {
printf("%.2f", -b / (2.0 * a));
} else {
printf("%.2f %.2f", (-b - sqrt((double)delta)) / (2.0 * a), (-b + sqrt((double)delta)) / (2.0 * a));
}
return 0;
}
5.2最大公约数与最小公倍数
cpp复制代码
#include <cstdio>
#include <cmath>
int gcd(int a,int b){
if(b==0)return a;//求最大公约数的辗转相除法递归写法
else return gcd(b,a%b);
}
int main() {
int m,n;
while(scanf("%d%d",&m,&n)!=EOF){
printf("%d\n",gcd(m,n));
}
return 0;
}
cpp复制代码
#include <cstdio>
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a / gcd(a, b) * b);
return 0;
}
5.3分数的四则运算
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction {
int up, down;
};
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
Fraction reduction(Fraction fraction) {
if (fraction.down < 0) {
fraction.up = -fraction.up;
fraction.down = -fraction.down;
}
if (fraction.up == 0) {
fraction.down = 1;
} else {
int d = gcd(abs(fraction.up), abs(fraction.down));
fraction.up /= d;
fraction.down /= d;
}
return fraction;
}
int main() {
Fraction fraction;
scanf("%d%d", &fraction.up, &fraction.down);
Fraction result = reduction(fraction);
if (result.down == 1) {
printf("%d", result.up);
} else {
printf("%d %d", result.up, result.down);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction {
int up, down;
};
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
Fraction reduction(Fraction fraction) {
if (fraction.down < 0) {
fraction.up = -fraction.up;
fraction.down = -fraction.down;
}
if (fraction.up == 0) {
fraction.down = 1;
} else {
int d = gcd(abs(fraction.up), abs(fraction.down));
fraction.up /= d;
fraction.down /= d;
}
return fraction;
}
Fraction add(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.down + f2.up * f1.down;
result.down = f1.down * f2.down;
return reduction(result);
}
int main() {
Fraction f1, f2;
scanf("%d%d%d%d", &f1.up, &f1.down, &f2.up, &f2.down);
Fraction result = add(f1, f2);
if (result.down == 1) {
printf("%d", result.up);
} else {
printf("%d %d", result.up, result.down);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction {
int up, down;
};
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
Fraction reduction(Fraction fraction) {
if (fraction.down < 0) {
fraction.up = -fraction.up;
fraction.down = -fraction.down;
}
if (fraction.up == 0) {
fraction.down = 1;
} else {
int d = gcd(abs(fraction.up), abs(fraction.down));
fraction.up /= d;
fraction.down /= d;
}
return fraction;
}
Fraction sub(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.down - f2.up * f1.down;
result.down = f1.down * f2.down;
return reduction(result);
}
int main() {
Fraction f1, f2;
scanf("%d%d%d%d", &f1.up, &f1.down, &f2.up, &f2.down);
Fraction result = sub(f1, f2);
if (result.down == 1) {
printf("%d", result.up);
} else {
printf("%d %d", result.up, result.down);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction {
int up, down;
};
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
Fraction reduction(Fraction fraction) {
if (fraction.down < 0) {
fraction.up = -fraction.up;
fraction.down = -fraction.down;
}
if (fraction.up == 0) {
fraction.down = 1;
} else {
int d = gcd(abs(fraction.up), abs(fraction.down));
fraction.up /= d;
fraction.down /= d;
}
return fraction;
}
Fraction multiply(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.up;
result.down = f1.down * f2.down;
return reduction(result);
}
int main() {
Fraction f1, f2;
scanf("%d%d%d%d", &f1.up, &f1.down, &f2.up, &f2.down);
Fraction result = multiply(f1, f2);
if (result.down == 1) {
printf("%d", result.up);
} else {
printf("%d %d", result.up, result.down);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction {
int up, down;
};
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
Fraction reduction(Fraction fraction) {
if (fraction.down < 0) {
fraction.up = -fraction.up;
fraction.down = -fraction.down;
}
if (fraction.up == 0) {
fraction.down = 1;
} else {
int d = gcd(abs(fraction.up), abs(fraction.down));
fraction.up /= d;
fraction.down /= d;
}
return fraction;
}
Fraction div(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.down;
result.down = f1.down * f2.up;
return reduction(result);
}
int main() {
Fraction f1, f2;
scanf("%d%d%d%d", &f1.up, &f1.down, &f2.up, &f2.down);
Fraction result = div(f1, f2);
if(!f2.up){
printf("undefined");
}
else if (result.down == 1) {
printf("%d", result.up);
} else {
printf("%d %d", result.up, result.down);
}
return 0;
}
5.4素数
cpp复制代码
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
bool isPrime(int n){
if(n<=1)return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0)return false;
}
return true;
}
int main() {
int n;
scanf("%d",&n);
if(isPrime(n))printf("Yes");
else printf("No");
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
bool isPrime(int n){
if(n<=1)return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0)return false;
}
return true;
}
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<n+1;i++)
{
if(isPrime(i))printf("%d\n",i);
}
return 0;
}
5.5质因子分解
cpp复制代码
#include <cstdio>
int main() {
int n;
scanf("%d", &n);
int counter = 0;
while (n % 2 == 0) {
counter++;
n /= 2;
}
printf("%d", counter);
return 0;
}
cpp复制代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 1000 + 1;
bool isPrime[MAXN];
vector<int> primes;
void getPrimes(int n) {
memset(isPrime, true, sizeof(isPrime));
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes.push_back(i);
for (int j = i + i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
}
int main() {
int n;
scanf("%d", &n);
getPrimes((int)sqrt(1.0 * n));
for (int i = 0; i < primes.size() && n > 1; i++) {
int counter = 0;
while (n > 1 && n % primes[i] == 0) {
counter++;
n /= primes[i];
}
if (counter > 0) {
printf("%d %d\n", primes[i], counter);
}
}
if (n > 1) {
printf("%d 1", n);
}
return 0;
}
5.6大整数运算
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
int compare(BigInt a, BigInt b) {
if (a.size() > b.size()) {
return 1;
} else if (a.size() < b.size()) {
return -1;
} else {
for (int i = (int)a.size() - 1; i >= 0; i--) {
if (a[i] > b[i]) {
return 1;
} else if (a[i] < b[i]) {
return -1;
}
}
return 0;
}
}
int main() {
string nums1, nums2;
cin >> nums1 >> nums2;
BigInt a = toBigInt(nums1);
BigInt b = toBigInt(nums2);
int compareResult = compare(a, b);
if (compareResult < 0) {
printf("a < b");
} else if (compareResult > 0) {
printf("a > b");
} else {
printf("a = b");
}
}
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
BigInt add(BigInt a, BigInt b) {
BigInt c;
int carry = 0;
for (int i = 0; i < a.size() || i < b.size(); i++) {
int aDigit = i < a.size() ? a[i] : 0;
int bDigit = i < b.size() ? b[i] : 0;
int sum = aDigit + bDigit + carry;
c.push_back(sum % 10);
carry = sum / 10;
}
if (carry) {
c.push_back(carry);
}
return c;
}
void print(BigInt a) {
for (int i = (int)a.size() - 1; i >= 0; i--) {
cout << a[i];
}
}
int main() {
string nums1, nums2;
cin >> nums1 >> nums2;
BigInt a = toBigInt(nums1);
BigInt b = toBigInt(nums2);
print(add(a, b));
return 0;
}
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
int compare(BigInt a, BigInt b) {
if (a.size() > b.size()) {
return 1;
} else if (a.size() < b.size()) {
return -1;
} else {
for (int i = (int)a.size() - 1; i >= 0; i--) {
if (a[i] > b[i]) {
return 1;
} else if (a[i] < b[i]) {
return -1;
}
}
return 0;
}
}
BigInt sub(BigInt a, BigInt b) {
BigInt c;
for (int i = 0; i < a.size() || i < b.size(); i++) {
int bDigit = i < b.size() ? b[i] : 0;
if (a[i] < bDigit) {
a[i + 1]--;
a[i] += 10;
}
c.push_back(a[i] - bDigit);
}
while (c.size() > 1 && c.back() == 0) {
c.pop_back();
}
return c;
}
void print(BigInt a) {
for (int i = (int)a.size() - 1; i >= 0; i--) {
cout << a[i];
}
}
int main() {
string nums1, nums2;
cin >> nums1 >> nums2;
BigInt a = toBigInt(nums1);
BigInt b = toBigInt(nums2);
if (compare(a, b) >= 0) {
print(sub(a, b));
} else {
cout << "-";
print(sub(b, a));
}
return 0;
}
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
int compare(BigInt a, BigInt b) {
if (a.size() > b.size()) {
return 1;
} else if (a.size() < b.size()) {
return -1;
} else {
for (int i = (int)a.size() - 1; i >= 0; i--) {
if (a[i] > b[i]) {
return 1;
} else if (a[i] < b[i]) {
return -1;
}
}
return 0;
}
}
BigInt mul(BigInt a, int b) {
BigInt c;
int carry=0;;
for (int i = 0; i < a.size(); i++) {
int temp=a[i]*b+carry;
c.push_back(temp%10);
carry=temp/10;
}
while(carry!=0){
c.push_back(carry%10);
carry/=10;
}
while (c.size() > 1 && c.back() == 0) {
c.pop_back();
}
return c;
}
void print(BigInt a) {
for (int i = (int)a.size() - 1; i >= 0; i--) {
cout << a[i];
}
}
int main() {
string nums;
int b;
cin >> nums >> b;
BigInt a = toBigInt(nums);
print(mul(a, b));
return 0;
return 0;
}
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
BigInt mul(BigInt a, BigInt b) {
BigInt c = BigInt(a.size() + b.size() + 1, 0);
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < b.size(); j++) {
c[i + j] += a[i] * b[j];
}
}
for (int i = 0; i < a.size() + b.size(); i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] = c[i] % 10;
}
}
while (c.size() > 1 && c.back() == 0) {
c.pop_back();
}
return c;
}
void print(BigInt a) {
for (int i = (int)a.size() - 1; i >= 0; i--) {
cout << a[i];
}
}
int main() {
string nums1, nums2;
cin >> nums1 >> nums2;
BigInt a = toBigInt(nums1);
BigInt b = toBigInt(nums2);
print(mul(a, b));
return 0;
}
cpp复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef vector<int> BigInt;
BigInt toBigInt(string nums) {
BigInt result;
for (int i = (int)nums.length() - 1; i >= 0; i--) {
result.push_back(nums[i] - '0');
}
return result;
}
BigInt div(BigInt a, int b, int &r) {
BigInt c;
for (int i = (int)a.size() - 1; i >= 0; i--) {
r = r * 10 + a[i];
c.push_back(r / b);
r = r % b;
}
reverse(c.begin(), c.end());
while (c.size() > 1 && c.back() == 0) {
c.pop_back();
}
return c;
}
void print(BigInt a) {
for (int i = (int)a.size() - 1; i >= 0; i--) {
cout << a[i];
}
}
int main() {
string nums;
int b, r = 0;
cin >> nums >> b;
if (b == 0) {
cout << "undefined";
return 0;
}
BigInt a = toBigInt(nums);
BigInt q = div(a, b, r);
print(q);
cout << " " << r;
return 0;
}
5.7扩展欧几里得算法
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf(c % gcd(a, b) == 0 ? "Yes" : "No");
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exGcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
int main() {
int a, b, x, y;
scanf("%d%d", &a, &b);
int d = exGcd(a, b, x, y);
int step = b / d;
int minX = (x % step + step) % step;
printf("%d %d", minX, (d - a * minX) / b);
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exGcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
int solve(int a, int b, int c) {
int x, y;
int d = exGcd(a, b, x, y);
if (c % d) {
return -1;
} else {
int step = abs(b / d);
int minX = (c * x / d % step + step) % step;
return minX;
}
}
int main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int minX = solve(a, b, c);
if (minX == -1) {
printf("No Solution");
} else {
printf("%d %d", minX, (c - a * minX) / b);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exGcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
int solve(int a, int b, int c) {
int x, y;
int d = exGcd(a, b, x, y);
if (c % d) {
return -1;
} else {
int step = abs(b / d);
int minX = (c * x / d % step + step) % step;
return minX;
}
}
int main() {
int a, c, m, x, y;
scanf("%d%d%d", &a, &c, &m);
int minX = solve(a, m, c);
if (minX == -1) {
printf("No Solution");
} else {
printf("%d", minX);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exGcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
int invert(int a, int m) {
int x, y;
int d = exGcd(a, m, x, y);
if (d != 1) {
return -1;
} else {
return (x % m + m) % m;
}
}
int main() {
int a, m;
scanf("%d%d", &a, &m);
int result = invert(a, m);
if (result == -1) {
printf("No Solution");
} else {
printf("%d", result);
}
return 0;
}
cpp复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = exGcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
int invert(int a, int m) {
int x, y;
int d = exGcd(a, m, x, y);
if (d != 1) {
return -1;
} else {
return (x % m + m) % m;
}
}
int main() {
int n, a, m, b;
scanf("%d%d%d", &n, &a, &m);
int result = invert(abs(a), m);
for (int i = 0; i < n; i++) {
scanf("%d", &b);
result = (result * b) % m;
}
printf("%d", result);
return 0;
}
5.8组合数
cpp复制代码
#include <cstdio>
int cal(int n,int p)
{
if(n<p)return 0;
return n/p+cal(n/p,p);
}
int main() {
int n,p=2;
scanf("%d", &n);
printf("%d", cal(n,p));
return 0;
}
cpp复制代码
#include <cstdio>
typedef long long LL;
LL C(LL n, LL m) {
LL ans = 1;
for (LL i = 1; i <= m; i++) {
ans = ans * (n - m + i) / i;
}
return ans;
}
int main() {
LL n, m;
scanf("%lld%lld", &n, &m);
printf("%lld", C(n, m));
return 0;
}