首页 > 试题广场 > 数组变换
[编程题]数组变换
  • 热度指数:2041 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。
牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。
这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

输入描述:
输入一个正整数N (N <= 50)
接下来一行输入N个正整数,每个数均小于等于1e9.


输出描述:
假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO"
示例1

输入

2
1 2

输出

YES
把数组每一个元素都除以2,直到它为奇数。如果此时数组每个元素都一样,满足条件
import java.util.Scanner;
 
//校招模拟:数组变换
publicclassMain {
 
    publicstaticvoidmain(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = newScanner(System.in);
        intn = scanner.nextInt();
        int[] data = newint[n];
        for(inti = 0; i < n; i++) {
            data[i]=scanner.nextInt();
            while(data[i]%2==0) {
                data[i]=data[i]/2;         
            }
        }
        intflag = data[0];
        for(inti = 1; i < n; i++) {
            if(data[i]!=flag) {
                System.out.println("NO");
                return;
            }
        }
        System.out.println("YES");
        scanner.close();
    }
 
}

发表于 2017-05-20 00:42:31 回复(9)
此题知识点应该是考如何判断一个整数是2的指数幂

满足YES条件,可知所有数因式分解后,只有2的个数不同.
因此一个for循环,两个两个处理,用大数除以小数,得到商和余数.
如果商不是2的幂,或者余数不等于0,则终止循环,输出NO。

证明商是否2的指数幂,可以使用二进制规律,2的指数幂对应的二进制中1的个数为1.
因此可以通过 n & (n-1) == 0 判断商是否2的指数幂。如8&7==0, 16&15=0

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        for(int i=0;i<n;i++){
            a[i] = scanner.nextInt();
        }
        for(int i=1;i<n;i++){
            int small, big;
            if(a[i]>a[i-1]){
            	small = a[i-1];
               	big = a[i];
            }else{
            	small = a[i];
            	big = a[i-1];
            }
            int remainder = big % small;
            int quotient = big / small;
            if(remainder!=0||(quotient&(quotient-1))!=0)
            {
                System.out.println("NO");
                return;
            }
        }
        System.out.println("YES");
    }
}

编辑于 2017-06-07 00:24:11 回复(0)
#include<stdio.h>
int a[50],i,n,flag=1;
int main(){
    for(scanf("%d",&n),i=0;i<n;i++){
        scanf("%d",a+i);
        while(a[i]%2==0) a[i]/=2;
        if(i>0&&a[i]!=a[i-1]) flag=0;
    }
    printf("%s\n",flag?"YES":"NO");
}

发表于 2017-11-11 12:53:07 回复(0)
#include <iostream>
using namespace std;

bool judge(int a, int b) {
    if (a != b) {   //不相等且除不尽,首先排除
        int mod = a > b ? a % b : b % a;
        if (mod) {
            return false;
        }
    }
    if (a == b) {
        return true;
    }
    int n = a > b ? a / b : b / a;
    while (n > 1) {
        if (n % 2 == 0) {
            n /= 2;
        } else {
            return false;
        }
    }
    return true;
}

int main(int argc, const char * argv[]) {
    int n;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    string ok = "YES";
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (!judge(arr[i], arr[j])) {
                ok = "NO";
                break;
            }
        }
        if (ok == "NO") {
            break;
        }
    }
    cout << ok;
    return 0;
}
发表于 2017-10-20 04:44:17 回复(0)
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
bool iseq(int a[],int len){
    sort(a,a+len);
    bool flag=true;
    for(int k=1;k<len;k++){
        if(a[k]%a[k-1]!=0){
            flag=false;
            break;
        }
    }
    if(flag) return true;
    return false;
}
int main(){
    int n;
    cin>>n;
    int a[50];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    if(iseq(a,n)) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}
发表于 2017-07-29 12:01:15 回复(0)
#include<iostream>
using namespace std;

char* isEqual(int arr[], int N)
{
for (int i = 0; i < N; i++)
{
while (arr[i] % 2 == 0)
arr[i] /= 2;
}
for (int i = 1; i < N; i++)
{
if (arr[i] != arr[0])
return "NO";
}
return "YES";
}

int main()
{
int n;
cin >> n;
int numb[81];
for (int i = 0; i < n; i++)
cin >> numb[i];
cout << isEqual(numb, n) << endl;
return 0;
}
发表于 2017-06-22 16:52:34 回复(0)
  1. 看着上面的回答改的,找出最大数,除各个数,能除尽并且结果全部是2的n次方的,就是满足条件的

    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
    	vector<int> array;
    	int in, a;
    	cin >> in;
    	int count = 0;
    	for (int i = 0; i < in; i++)
    	{
    		cin >> a;
    		array.push_back(a);
    		//if (0== (a&(a - 1)))
    		//	count++;
    
    
    	}
    	std::vector<int>::iterator biggest = std::max_element(std::begin(array), std::end(array));
    	for (auto s:array)
    	{
    		if (*biggest%s == 0)
    		{
    			int temp = *biggest / s;
    			if (0 == (temp&(temp - 1)))
    				count++;
    
    		}
    	}
    	if (count == in)
    		cout << "YES" << endl;
    	else
    
    		cout << "NO" << endl;
    }
发表于 2017-06-05 11:25:42 回复(0)
#include<iostream>
#include<cstring>
using namespace std;
int main(){
    int n;
    int a[51];
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        while(a[i] % 2 == 0)    a[i] /= 2;
    }  
    for(int i = 1; i < n; i++){
        if(a[i] != a[i-1]){
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}
发表于 2017-05-24 17:25:45 回复(0)
python版本,思路是把数组每一个元素都除以2,直到它为奇数。如果此时数组每个元素都一样,满足条件,一楼的思想
def test():
    length = int(input())
    # list_1 = [int(i) for i in input().split()]
    list_1 = list(map(int,input().split()))
    for i in range(length):
        while list_1[i]%2==0:
            list_1[i] /= 2
        else:
            continue
    list_1 = set(list_1)
    if len(list_1)==1:
        print("YES")
    else:
        print("NO")


发表于 2019-08-27 09:47:04 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
         if(n<2){
            System.out.println("YES");
             return;
        }
        int[] array = new int[n];
       for(int i=0; i<n; i++){
           array[i] = sc.nextInt();
       }
        Arrays.sort(array);
       
        for(int j=0; j<n; j++){
           boolean flag = true;
            while(flag){
                 if(array[j]<array[n-1]){
                    flag = true;
                 }else if(array[j]==array[n-1]){
                    flag = false;  
                 }else{
                   System.out.println("NO"); 
                     return;
                 }
                array[j] = array[j]*2;
            }
        }
        System.out.println("YES");
        return;
    }
}

发表于 2018-09-27 19:45:25 回复(1)
先排序,然后从最低位开始排查,若和后一位相等,则继续,若不等,则检查加倍后是否相等,依次往后排查直到最后。中间若有一次不满足则输出NO,否则输出YES

public class Main4 {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
         
        Arrays.sort(nums);        //排序
        
        for(int i=0;i<n-1;i++){
            if(isOK(nums[i], nums[i+1]))
                continue;
            else{
                System.out.println("NO");
                return;
            }
        }
        System.out.println("YES");
        scanner.close();
        
    }
    
    public static boolean isOK(int m,int n){
        if(m==n)
            return true;
        while(m<n){
            m*=2;
            if(m==n)
                return true;
        }
        return false;
    }
}

发表于 2018-05-15 10:50:26 回复(0)

import java.util.Scanner;

/*
 * 如果所有的数都能通过转换变成同一个数,那么原数组中最大数一定是其他数的2^n次倍
 * */
public class ArrayTransfer {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int[] nums = new int[n];
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < n; i++) {
                nums[i] = scanner.nextInt();
                max = Math.max(max, nums[i]);
            }
            boolean flag = true;

            for (int i = 0; i < n; i++) {
                int tmp = max / nums[i];
//                判断是否为2^n次倍
                if ((tmp & (tmp - 1)) != 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
}
发表于 2018-04-05 17:18:55 回复(0)
 
<?php
$ge=trim(fgets(STDIN));
$array=explode(' ',trim(fgets(STDIN)));
for($i=0;$i<$ge-1;$i++){
    for($j=0;$j<$ge-$i-1;$j++){
        if($array[$j]>$array[$j+1]){
            $t= $array[$j];
            $array[$j] = $array[$j+1];
            $array[$j+1] = $t;
        }
    }
}
$k=0;$t=1;
for($y=0;$y<$ge-1;$y++){
    if(($array[$y+1]==$array[$y])==1){
        $t++;
        continue;
    }
    if(($array[$y+1]/$array[$y])%2!=0){
        $k++;
    }
 
}
if(($k==0)||$t==$ge){
    echo("YES");
}else{
    echo("NO");
}

发表于 2018-03-22 17:46:51 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int size=scanner.nextInt();
        int arr[]=new int[size];
        for(int i=0;i<size;i++)
        {
            arr[i]=scanner.nextInt();
            while(arr[i]%2==0)
            {
                arr[i]=arr[i]/2;
            }
        }
        if(isSame(arr))
        {
            System.out.println("YES");
        }
        else {
            System.out.println("NO");
        }
    }
    
    /**
     * 判断数组中是否所有的元素都相同
     * @param arr
     * @return
     */
    public static boolean isSame(int[] arr)
    {
        int start=arr[0];
        for(int num:arr)
        {
            if(num!=start)
            {
                return false;
            }
        }
        return true;
    }
}



发表于 2017-10-27 15:50:33 回复(0)
import java.util.*;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
         Scanner sc=new Scanner(System.in);
         while(sc.hasNext()){
        	 int num=sc.nextInt();
        	 int arr[]=new int[num];
        	 int i=0;
        	 while(i<num){
        		 arr[i]=sc.nextInt();
        		 i++;
        	 }
        	 Arrays.sort(arr);
        	 boolean flag=true;
        	 int maxVal=arr[arr.length-1];
        	 int index=0;
        	 for(int j=0;j<arr.length-1;j++){
         	    int tmp=maxVal/arr[j];
        	    if(maxVal==arr[j]){
        	    	index++;
        	    }else if(tmp%2!=0){
        	    	flag=false;
        	    	System.out.println("NO");
        	    	sc.close();
        	    	return;
        	    }
        	 }
        	 if(flag||index==arr.length-1){
        	 System.out.println("YES");
        	 }
         }
    	 sc.close();
	}
}


发表于 2017-08-21 11:16:12 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int l=scanner.nextInt();
        int[] arr=new int[l];
        for (int i=0;i<l;i++)
            arr[i]=scanner.nextInt();
        isEq(arr);
    }
    private static void isEq(int[] arr) {
        boolean b = true;
        int sq;
        A:for (int i=0;i<arr.length;i++){
            for (int j=0;j<arr.length;j++){
                if (arr[i]<arr[j]){
                    sq=arr[j]/arr[i];
                    if (isC(sq))
                        b=true;
                    else{
                        b=false;
                        break A;
                    }
                }
            }
        }
        if (b) System.out.println("YES");
        else System.out.println("NO");
    }
    private static boolean isC(int i) {
        if (i%2==1&&i/2>0) return false;
        if (i/2==1||i==1) return true;
        else return isC(i/2);
    }
}
发表于 2017-08-08 22:46:34 回复(0)
package 全国统一模拟第三场;

import java.util.Scanner;

public class Main_4 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext())
		{
			int n=sc.nextInt();
			int []arr=new int[n];
			for(int i=0;i<n;i++)
				arr[i]=sc.nextInt();
			change(arr);
		}
		sc.close();
	}
	public static void change(int []arr)
	{
		
		for(int i=0;i<arr.length;i++)
		{	
			while(arr[i]%2==0)
				arr[i]/=2;
		}
		for(int i=0;i<arr.length-1;i++)
		{
			if(arr[i]!=arr[i+1])
			{
				System.out.println("NO");
				return;
			}			
		}
		System.out.println("YES");		
	}

}


发表于 2017-07-19 22:16:59 回复(0)
#encoding=utf-8
from __future__ import division
def two_square():
    return [2**i for i in range(10)] # 2的倍数
def f(n, num, _2):
    _max = max(num)
    max_count = 5 # 实际程序5次应该够了
    
    for i in range(max_count):
        ret = 0
        for j in range(n):
            if _max/num[j] in _2: # 最大数/该数字 = 2的倍数
                ret += 1
            else:
                break
        if ret == n:
            return 'YES'
        _max *= 2   # 最大数*2
    return 'NO'

if __name__ == '__main__':
    _2 = two_square()
    while 1:
        try:
            n = int(raw_input())
            num = map(int, raw_input().split())
        except:
            break
        print f(n, num, _2)

发表于 2017-07-18 09:35:34 回复(0)
#include <iostream>
#include <vector>
using namespace std;
 
intmain(void)
{
    intN;
    cin >> N;
    vector<int> vec(N);
    for(inti = 0; i < N; i++)
        cin >> vec[i];
    for(inti = 0; i < N - 1; i++)
    {
        for(intj = i + 1; j < N; j++)
        {
            intm = vec[i] > vec[j] ? vec[i] : vec[j];
            intn = vec[i] < vec[j] ? vec[i] : vec[j];
            intnum = m / n;
            if(num&(num - 1))
            {
                cout << "NO"<< endl;
                return0;
            }
        }
    }
    cout << "YES"<< endl;
    return0;
}
发表于 2017-07-12 16:51:26 回复(0)
var n=parseInt(readline())
var arr=readline().split(' ').map(item=>2*parseInt(item))
arr.sort((a,b)=>a-b)
var max=arr.pop()
var flag=arr.every(item=>max%item===0)
if(flag)print('YES')
elseprint('NO')
//我的方法复杂度应该有点高,我先将所有数乘以2,找最大数,用最大数除以其他数,若能整除则输出yes
发表于 2017-06-16 17:58:26 回复(0)