OJ题目思路整理以及具体实现

it2022-05-08  11

1、计算一个数字二进制的个数

# If you need to import additional packages or classes, please import here. def func(): # please define the python3 input here. For example: a,b = map(int, input().strip().split()) # please finish the function body here. # please define the python3 output here. For example: print(). while True: try: n = int(input()) if n < 0: n = n & 0xffffffff count = 0 while n: n = n & (n-1) count += 1 print(count) except EOFError: break if __name__ == "__main__": func()

2.最大公约数PLUS 从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数,用符号c(n,m)表示。 计算公式为:c(n,m)=n!/((n-m)!×m!) 现在你的任务是求出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。

解答要求 时间限制:5000ms, 内存限制:64MB 输入 输入只有一个整数n(1<n<=10000)。

输出 输出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。

样例 输入样例 1 复制

3 输出样例 1

2

提示 范例中n=3,则C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)为6,20,6,则他们的最大公约数为2。 解题思路: 首先C(2n,1)=C(2n,2n-1); c(2n,1)是c(2n,3)的因子(当且仅当2n可以被3整除时不是) c(2n,1)是c(2n,5)的因子(当且仅当2n可以被5整除时不是) 以此类推只要判断2n可以被奇数整除就可以, 又存在 3和9这类倍数的奇数,,所以每次约分后又要从1算起,,

int main(){ int n; cin>>n; for(int i=3;i<=n;i+=2){ if(n%i==0){ n=n/i; i=1; } } cout<<2*n; return 0; }

4.整数拆分 问题描述 输入一个N,输出所有拆分的方式。

如input: 3

output: 1+1+1

1+2

3

算法思想 用一个数组res[]存放拆分的解,用全局变量存放拆分的方法数。divN(n,k)使用n表示要分解的整数,k表示res数组下标,即第k次拆分。先从divN(n,1)开始,用num表示第k个拆分的数,即res[k]=num,让num在[1,n]内遍历。用rest=n-num表示拆分后剩下的整数值。若rest等于零,代表本次拆分结束,输出拆分解。否则处理第k+1个数组元素,即divN(rest,k+1),依次类推,直到rest为0输出结果。

数据结构 divN(int n,int k): n表示要分解的整数,k表示res数组下标,即第k次拆分。 res[10000]: 存储划分的结果,由于数组长度限制,最大的整数不能超过10000。 times : 全局变量存放拆分的方法数。

源代码

#include "stdafx.h" #include<stdio.h> #include<stdlib.h> int res[10000] = { 0 }; //res数组存放解 int times = 0; //times计算拆分的次数 void divN(int n, int k) { //n是需要拆分的整数,k是指res数组的下标 int rest; //存放拆分后剩余的整数 for (int num = 1;num <= n; num++) { //从1开始尝试拆分 if (num >= res[k - 1] ) { //拆分的解要大于或等于前一个解保证不重复 res[k] = num; //将这次拆分存放在res数组中 rest = n - num; //剩下的是n-num if (rest == 0) { //如果没有剩下的,说明本次拆分结束 times++; //拆分次数加1 printf("=:", times); for (int j = 1; j < k; j++) { //输出解 printf("%d+", res[j]); } printf("%d\n", res[k]); } else divN(rest, k + 1); //如果有剩下的,继续求出res[k+1] } } } int main() { int n; printf("Please enter a integer N:"); scanf_s("%d", &n); divN(n, 1); printf("there are %d ways to divide the integer %d.", times,n); system("pause"); return 0; }

最新回复(0)