zoukankan      html  css  js  c++  java
  • NOJ 1643 阶乘除法(YY+小技巧)

    • [1643] 阶乘除法

    • 时间限制: 5000 ms 内存限制: 65535 K
    • 问题描述
    • 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1)。 比如,若 n=6, m=3,则n!/m!=6!/3!=720/6=120

      是不是很简单?现在让我们把问题反过来:输入 k=n!/m!,找到这样的整数二元组(n,m) (n>m>=1)

      如果答案不唯一,n 应该尽量小。比如,若 k=120,输出应该是 n=5, m=1,而不是 n=6, m=3,因为 5!/1!=6!/3!=120,而 5<6

    • 输入
    • 输入包含不超过 100 组数据。每组数据包含一个整数 k (1<=k<=10^9)。
    • 输出
    • 对于每组数据,输出两个正整数 n 和 m。无解输出"Impossible",多解时应让 n 尽量小。
    • 样例输入
    • 120
      1
      210
    • 样例输出
    • Case 1: 5 1
      Case 2: Impossible
      Case 3: 7 4

    试了打表、除法、都不行,我还是太若比了,还是看了别人的代码才知道怎么写,最关键就是控制外循环的范围。

    代码:

    #include<stdio.h>
    int main(void)
    {
    	__int64 i,j,sum,n;
    	int t=0;
    	bool ok;
    	while(~scanf("%I64d",&n))
    	{
    		t++;
    		ok=0;
    		for(i=1;i*i<=n;i++)//就是这个地方需要i*i<=n
    		{
    			sum=i;
    			for(j=i+1;;j++)
    			{
    				sum=sum*j;
    				if(sum==n)
    				{
    					if(i!=1)
    						i--;//若分母不为1,则减1
    					printf("Case %d: %I64d %I64d
    ",t,j,i);
    					ok=1;
    					break;
    				}
    				if(sum>n)
    					break;
    			}
    			if(ok)
    				break;
    		}
    		if(!ok)
    		{
    			if(n!=1)
    				printf("Case %d: %I64d %I64d
    ",t,n,n-1);
    			else
    			printf("Case %d: Impossible
    ",t);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    linux里终端安转视频播放器的操作及显示
    String字符串操作
    普通类 抽象类 接口
    java基础
    关于window的端口查看及tomcat的端口修改问题
    eclipse的应用和整理
    mysql学习
    echarts的使用
    Failed to read candidate component class
    oracle学习笔记2
  • 原文地址:https://www.cnblogs.com/Blackops/p/5255225.html
Copyright © 2011-2022 走看看