输入中有多组测试数据,每组测试数据为一个整数A
对每组测试数据,在单独的行中以X/Y的形式输出结果。
5 3
7/3 2/1
很简单但还是刷一波哈哈哈
要约分还是有点烦的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int fun(int x, int y){
int sum = 0;
while(x){
sum += (x % y);
x /= y;
}
return sum;
}
int main(){
int n, ans;
while(scanf("%d", &n) == 1){
ans = 0;
for(int i = 2; i < n; i++) ans += fun(n, i);
int fenmu = n - 2, fenzi = ans;
for(int i = 2; i <= min(n-2, ans);i++)
while((fenmu % i == 0) &&(fenzi % i == 0)) {fenmu /= i; fenzi /= i;}
cout<<fenzi<<"/"<<fenmu<<endl;
}
return 0;
}
# 不仅考察进制换算,还考察最大公约数 def f1(n): # 进制换算,计数 ret = 0 for i in range(2,n): # 一次除以2至n-1,相当于换算成2至n-1进制 t = n while 1: ret += t % i # 将结果加入返回值 t = t // i if t == 0: break return ret def f2(n, m): # 求最大公约数 ret = 1 while m > 0: t = n % m n = m m = t ret = n return ret if __name__ == '__main__': while 1: try: n = int(raw_input()) except: break r = f1(n) # r是总的进制换算相加的数 l = len(range(2, n)) # 被除数2 至(n-1) s = f2(r, l) # 最大公约数 r , l = r//s, l//s # 结果除以最大公约数 print str(r) + '/' + str(l)
#include<iostream> #include<vector> using namespace std; int main() { int m; vector<int> v; cin >> m; for(int i = 2; i < m; i++)//i进制求和 { int n = m; while(n != 0) { int tmp = n % i; v.push_back(tmp); n = n / i; } } int sum = 0; for(int i = 0; i < v.size(); i++) sum = sum + v[i]; int num = m - 2; for(int i = m - 2; i > 1; i--)//约分 { if((sum % i == 0) && ((num) % i == 0)) { sum = sum / i; num = num / i; } } cout << sum << "/" << num << endl; }
from math import gcd
def calcSumOfANumber(number):
total = 0
for i in range(2, number):
res, num = 0, number
while num:
res += num % i
num = num // i
total += res
return total
while True:
try:
a = int(input())
b = calcSumOfANumber(a)
gcdRes = gcd(b, a - 2)
print(str(b // gcdRes) + "/" + str((a - 2) // gcdRes))
except:
break
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNextInt()){ int num = scanner.nextInt(); int sum = 0; for(int i = 2; i <= num - 1; i++){ sum += hexSum(num, i); } int gcd = gcd(sum, num - 2); System.out.println(sum / gcd + "/" + (num - 2) / gcd); } scanner.close(); } public static int gcd(int one, int two){ return two == 0 ? one : gcd(two, one % two); } public static int hexSum(int num, int base){ int sum = 0; while(num != 0){ sum += num % base; num = num / base; } return sum; } }
import java.util.Scanner; public class StringUtil{ //禁止均值 public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); int sum = 0; for(int i=2; i<=n-1; i++){ sum += jzh(n,i); } int gys = gy(sum, n-2); System.out.println(sum/gys + "/" +(n-2)/gys); } } //求最大公约数 public static int gy(int a, int b){ if(a > b){ a = a+b; b = a-b; a = a-b; } while(a != 0){ int c = b%a; b = a; a = c; } return b; } //求进制和 public static int jzh(int n,int m){ int sum = 0; while(n != 0){ sum += n%m; n /= m; } return sum; } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int val = scanner.nextInt(); int totalSum = 0; // 遍历不同进制 for (int i = 2; i <= val - 1; i++) totalSum += sum(val, i); // 求val在i进制下各位数的和 int k = val - 2; // 可以转化为几种进制 int commondiv = commonDiv(totalSum, k); // 约分输出 System.out.println(totalSum / commondiv + "/" + k / commondiv); } scanner.close(); } public static int sum(int val, int factor){ int sum = 0; while(val > 0){ sum += val % factor; val /= factor; } return sum; } // 求最大公约数,使用辗转相除法 public static int commonDiv(int a,int b){ if(a < b){ // a中存较大的那个值 a = a ^ b; b = a ^ b; a = a ^ b; } while (a % b != 0) { int leave = a % b; // 求余数 a = b; b = leave; } return b; } }
#include <stdio.h> int n,sum; int gcd(int a,int b); int main() { int i,t; while(scanf("%d",&n)!=EOF) { sum = 0; for(i=2;i^n;i++) for(t=n;t;t/=i) sum += t % i; n -= 2; t = gcd(sum,n); printf("%d/%d\n",sum/t,n/t); } return 0; } int gcd(int a,int b) { return b?gcd(b,a%b):a; }
在进制转换过程中累加每位的和,进制转换从2进制一直到A-1进制。 然后求sum和A-2的最大公约数,分别除以最大公约数,即可得不可约的分数 import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()) { int n = scanner.nextInt(); System.out.println(sumAndAve(n)); } } public static String sumAndAve(int n) { int sum = 0; for (int i = 2;i < n;i ++) { sum += convert(n, i, 0); } int gcd = gcd(sum, n - 2); return sum/gcd + "/" + (n - 2)/gcd; } // // 2-16进制表示的位数 // public String[] arr = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", // "A", "B", "C", "D", "E", "F"}; /** * @param number 要转换的十进制数 * @param system 转换的进制位 */ public static int convert(int number, int system, int sum) { sum = number % system + sum; if(number/system == 0) return sum; return convert(number/system, system, sum); } public static int gcd(int x, int y){ // 这个是运用辗转相除法求 两个数的 最大公约数 看不懂可以百度 // 下 if(y == 0) return x; else return gcd(y,x%y); } }
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int count = 0; for(int i = 2;i< n;i++) { count += function(n,i); } int maxcommon = common(count,n-2); System.out.println(count/maxcommon+"/"+(n-2)/maxcommon); } private static int common(int x,int y) { int res = y; while(y!=0) { int temp = x; x = y; y = temp % y; } return x; } private static int function(int x,int radis) { int count= 0; int tmp = x; while(tmp != 0) { count+=tmp%radis; tmp/=radis; } return count; } }
#include <iostream>
using namespace std;
int convert(int A, int B)//A在B进制下的各位数之和
{
int after=0;
while(A!=0)
{
int temp=A%B;
after=after+temp;
A=A/B;
}
return after;
}
int main(int argc, const char * argv[]) {
int A;
cin>>A;
int sum=0;
for(int i=2;i<=A-1;i++)//求和
{
sum=sum+convert(A, i);
}
int div=A-2;
for(int i=2;i<=div;)//化简
{
if(sum%i==0&&div%i==0)
{
sum/=i;
div/=i;
continue;
}
i++;
}
cout<<sum<<"/"<<div<<endl;
return 0;
}
#include <iostream> using namespace std; int Sum(int n, int m) { int sum = 0; while(n) { sum += n%m; n /= m; } return sum; } int gcd(int a, int b) { int t = a%b; while(t) { a = b; b = t; t = a%b; } return b; } int main() { int A, sum; while(cin>>A) { sum = 0; for(int i=2;i<=A-1;i++) sum += Sum(A,i); int u = gcd(sum, A-2); cout<<sum/u<<"/"<<(A-2)/u<<endl; } return 0; }
#include<stdio.h> #include<math.h> int getSum(int,int); int gcd(int,int); int main(){ int A,i; while(scanf("%d",&A)!=EOF){ int len=A-2,sum=0; for(i=2;i<A;i++) sum+=getSum(A,i); printf("%d/%d\n",sum/gcd(sum,len),len/gcd(sum,len)); } } int getSum(int x,int y){ int sum=0; while(x) sum+=x%y,x/=y; return sum; } int gcd(int a,int b){ return !b?a:gcd(b,a%b); }
// 万能c++头文件,包含c++所有头文件
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
// "~"符号不可缺失
while(~scanf("%d",&n)) {
int sum=0;
for(int i=2; i<n; i++) {
int m=n;
while(m) {
sum+=(m%i);
m/=i;
}
}
// 库函数__***(),用于求最大公约数
// 要是觉得不手写搁着难受,可用欧几里德算法手撸一个:
// 思想很简单:被除数%除数,如果余数为零,那么最大公约数***为除数
// 如果余数不为零,将除数赋给被除数,余数赋给除数,继续上述过程
// int x = sum,y = n-2;
// int z = x % y;
// while(z){
// x = y;
// y = z;
// z = x % y;
// }
int val = __***(sum,n-2);
printf("%d/%d\n",sum/val,(n-2)/val);
}
return 0;
}
#include <iostream> int main() { int A = 0; int sum = 0; while (std::cin >> A) { if (A == 1) { std::cout << "1" << "\n"; continue; } if (A == 2) { std::cout << "1/2" << "\n"; continue; } for (int i = 2; i <= A-1; ++i) { int temp = A; while (temp != 0) { sum += temp % i; temp = temp / i; } } int count = A-2; int t = sum > count ? sum : count; for (int i = 2; i <= t; ++i) { while (sum % i == 0 && count % i == 0) { sum = sum / i; count = count / i; } } std::cout << sum << "/" << count << "\n"; sum = 0; } }
print('{0}/{1}'.format(int(num),int(order)))