A+B problem

题目:

我们都喜欢 A+B 问题,现在我们遇到了它的一个变形问题,给定 A+B + C = D 的形式,并且规定 A,B,C,D 都是正整数。现在已经知道了 D 的大小, 请问有多少对不同的 (A,B,C) 满足 A + B + C = D,(A,B,C) 与 (A′,B′,C′) 被认为不同当且仅当 A ̸= A′ 或 B ̸= B′ 或 C ̸= C′。 Input 有多组数据,输入开始的第一行是一个整数 T, (T ≤ 100),代表数据组数 z。 接下 T 行,每行一个正整数 D,D ≤ 1000,含义在题面中已经说明。 Output 对于每个 D,输出一行,包含一个整数,代表符合条件的 (A,B,C) 的对数。
Sample Input Sample Output 3 1 4 100
Sample Output 0 3 4851

解答

大佬用一行写出来了代码,数学功底;
发现规律:
假设输入数据为m,则
1 1 m-2; 1 2 m-3; 1 3 m-4…1 m-2 1;
第一个数不变=1,则第二个和第三个之和为m-1,共有m-2种不同;
同理第一个数不变=2,则第二个和第三个之和为m-2,共有m-3种不同;
所以(m-2)+(m-1)+…+1=(m-1)*(m-2)/2,即为答案。
代码如下:

#include<stdio.h>
int main ()
{
	int n,m;
	scanf("%d",&n);
	while(n--){
		scanf("%d",&m);
		printf("%d\n",(m-1)*(m-2)/2);
		
	}
}

下面为自己写的:

#include<stdio.h>
int main()
{
	int t,m,i,j,k,u,count;
	scanf("%d",&t);
	for(i=0;i<t;i++){
		scanf("%d",&m);
		count=0;
		for(k=1;k<m;k++){
			for(j=1,u=m-k-j;j+k<m&&u>0;j++){
				count++;

			}
		}
		printf("%d\n",count);
	}
	
 } 

下面这个超时:

#include<stdio.h>
int main()
{
	int t,m,i,j,k,u,count;
	scanf("%d",&t);
	for(i=0;i<t;i++){
		scanf("%d",&m);
		count=0;
		for(k=1;k<m;k++){
			for(j=1;j+k<m;j++){
				if(k+j>=m) break;
				for(u=1;u<m;u++){
					if(k+j+u==m){
						count++;
					}
					else if(k+j+u>m) break;
				}
			}
		}
		printf("%d\n",count);
	}
	
 } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值